我正在制作一个由其他两个按钮组成的自定义按钮。它具有与普通按钮不同的行为(因此成为自定义按钮),看起来像这样

My Button Working 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);
}


当我尝试设置按钮图标时,按钮最终看起来像这样

My Button Broken http://i1078.photobucket.com/albums/w491/evesforeva/Screenshot2012-08-19at42508PM.png

在整个按钮中间复制图标的位置。我尝试删除firePropertyChange,但这没有用。

这也是我用来生成两个屏幕截图的代码

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

}


是什么让我的按钮显示整个按钮的图标而不是仅显示右键?我如何解决呢?

最佳答案

至于原因:您正在重写包含按钮的方法,以使包含按钮认为它具有图标-因此,其uidelegate在它认为适当的位置绘制它:-)

关于如何防止这种情况:取决于您要投入多少工作。


干净的方法是实现自定义ui委托,并为您要支持的所有LAF都实现。您可能想看看SwingX,它的plaf模块减轻了demonstrated in a recent thread的痛苦。
最简单的方法是不重复使用包含按钮的api:实现setIcon不执行任何操作,并添加新的方法来设置弹出图标。

关于java - 覆盖AbstractButton.getIcon的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12030904/

10-11 22:28