【问题标题】:Problems with overriding AbstractButton.getIcon覆盖 AbstractButton.getIcon 的问题
【发布时间】:2012-08-19 23:52:16
【问题描述】:

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

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

}

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

【问题讨论】:

  • 也需要MyButton ;)
  • @MadProgrammer MyButton 的代码真的很长(大约 1000 loc)。构造函数有帮助吗?
  • 简单介绍一下它是如何构建的。你说它扩展了AbstractButton,你如何去获取分隔符和附加到它的弹出窗口?
  • 'getter' 应该是 'adding' :P
  • @MadProgrammer 所有 AbstractButtons 都扩展了 Container,所以我只需使用 add 方法将内部按钮和分隔符添加到外部按钮。我想我的部分问题是我的按钮是一个按钮,但它也有按钮。

标签: java swing button custom-component


【解决方案1】:

至于原因:您正在覆盖包含按钮的方法,使得包含按钮认为它有一个图标 - 因此,它的 uielegate 在它认为合适的地方绘制它:-)

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

  • 干净的是实现自定义 ui-delegate 并为您想要支持的所有 LAF 实现它。你可能想看看SwingX,它的plaf 模块像demonstrated in a recent thread 一样减轻了一些痛苦。
  • 更简单的方法是不重复使用包含按钮的 api:实现 setIcon 什么都不做,并添加新的方法来设置弹出图标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多