1

他の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());
}

}

右のボタンだけでなく、ボタン全体のアイコンがボタンに表示されるのはなぜですか?そして、どうすればそれを回避できますか?

4

1 に答える 1

2

理由について:包含ボタンがアイコンを持っていると見なすように、包含ボタンのメソッドをオーバーライドしている-その結果、そのuidelegateは適切と見なす場所にそれをペイントします:-)

それを防ぐ方法について:あなたがそれに入れたい仕事の量に少し依存します。

  • クリーンな方法は、カスタムUIデリゲートを実装し、サポートするすべてのLAFにそれを実装することです。SwingXをご覧になることをお勧めします。最近のスレッドで示されているように、そのplafモジュールは少し苦痛を取り除きます
  • より簡単な方法は、含まれているボタンのAPIを再利用しないことです。setIconを実装して何もせず、ポップアップアイコンを設定するための新しいメソッドを追加します。
于 2012-08-20T08:19:45.820 に答える