他の2つのボタンで構成されるカスタムボタンを作成しています。通常のボタンとは動作が異なり(したがって、カスタムである理由)、次のようになります。
マイボタンの動作http://i1078.photobucket.com/albums/w491/evesforeva/Screenshot2012-07-28at21932AM.png
ボタンのアイコンの設定方法を変更して、右側のボタン(四角のボタン)に適用されるようにします。現在、AbstractButton.getIconとAbstractButton.setIconをオーバーライドして、ボタン全体ではなく、右側のボタンに適用されるようにしています。だから私のコードはこのように見えます
/* (non-Javadoc)
* @see javax.swing.AbstractButton#getIcon()
*/
@Override
public Icon getIcon() {
return popupButton.getIcon(); // popupButton = the right button
}
/* (non-Javadoc)
* @see javax.swing.AbstractButton#setIcon(javax.swing.Icon)
*/
@Override
public void setIcon(Icon icon) {
Icon oldValue = getIcon();
firePropertyChange(ICON_CHANGED_PROPERTY, oldValue, icon);
popupButton.setIcon(icon);
}
ボタンアイコンを設定しようとすると、ボタンは次のようになります。
私のボタンが壊れたhttp://i1078.photobucket.com/albums/w491/evesforeva/Screenshot2012-08-19at42508PM.png
ボタン全体の中央にアイコンが複製されています。firePropertyChangeを削除しようとしましたが、機能しませんでした。
また、2つのスクリーンショットを作成するために使用したコードもあります
public class MyButtonDemo implements Runnable {
public static class DemoPanel extends JPanel {
private static final long serialVersionUID = 1L;
public DemoPanel() {
MyButton myButton = new MyButton("My Button");
Icon icon = new ImageIcon(new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB));
myButton.setIcon(icon);
add(myButton);
add(new JButton("Normal Button"));
}
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels();
try {
UIManager.setLookAndFeel(lafs[2].getClassName());
} catch (Exception e) { }
JFrame frame = new JFrame();
frame.setContentPane(new DemoPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new MyButtonDemo());
}
}
右のボタンだけでなく、ボタン全体のアイコンがボタンに表示されるのはなぜですか?そして、どうすればそれを回避できますか?