gpt4 book ai didi

java - 重写 AbstractButton.getIcon 的问题

转载 作者:行者123 更新时间:2023-11-30 04:42:05 25 4
gpt4 key购买 nike

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

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-delegate 并为您想要支持的所有 LAF 实现它。您可能想看看SwingX ,它的 plaf 模块减轻了一些痛苦,如 demonstrated in a recent thread
  • 更简单的方法是不重复使用包含按钮的 api:实现 setIcon 不执行任何操作并添加用于设置弹出图标的新方法。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com