【发布时间】:2012-08-19 23:52:16
【问题描述】:
我正在制作一个由其他两个按钮组成的自定义按钮。它与普通按钮有不同的行为(因此它是自定义的)并且看起来像这样
我想更改按钮中图标的设置方式,以便它们应用于右侧的按钮(带有正方形的按钮)。目前,我正在覆盖 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);
}
当我尝试设置按钮图标时,按钮最终看起来像这样
图标在整个按钮的中间重复。我尝试删除 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