我问的是制作一个拥有某种状态的组件的正确方法。就像保存颜色的Jbutton一样,或者是保存某个对象的列表项。因此,当这些GUI组件触发事件时,我可以使用保存的状态对其执行某些操作。
我的方式就是这样:
1-创建所需组件的子类,如Jbutton的子类。
2-为这个新子类创建一个监听器:在监听器中检查事件源是否为子类,转换它然后使用存储的数据。
示例:
class ColorButton extends JButton
{
static class Listener implements ActionListener{
@Override
public void actionPerformed(ActionEvent actionEvent) {
Object source = actionEvent.getSource();
if( source.getClass() == ColorButton.class)
{
ColorButton t = (ColorButton) source;
t.getComponent().setBackground(t.getColor());
}
}
}
//states i want to be saved
private Color c;
private Component comp;
ColorButton(Component comp, Color c) {
setColorChanger(comp, c);
}
/* ......
......
rest of constructors added with those additions
......
*/
private void setColorChanger(Component comp, Color c)
{
this.comp = comp;
this.c = c;
}
Color getColor() {
return c;
}
Component getComponent() {
return comp;
}
}
我用这种方式:
JPanel panel = new JPanel();
ColorButton.Listener l = new ColorButton.Listener();
JButton b = new ColorButton("Blue", panel, Color.BLUE);
JButton r = new ColorButton("Red", panel, Color.RED);
r.addActionListener(l);
b.addActionListener(l);
panel.add(b);
panel.add(r);
add(panel);
所以我想知道这种方式是否正常或者是什么,我觉得为每个应该保持某种状态的组件制作它是非常无聊的,有更好的方法吗?
答案 0 :(得分:2)
是的,还有更好的方法。每个单独的组件对象都应该有自己独立的ActionListener,这样您就不必检查if( source.getClass() == ColorButton.class)
,并且可以直接访问组件的字段,而不必去通过source
。为了实现这一点,您必须使用非静态内部类或匿名内部类。 if
语句是一种非常老式且非OOP的处理方式。
实际上,组件对象本身可以是自己的 ActionListener - 但是这种样式只允许你有一个ActionListener,并且组织得不那么好。
答案 1 :(得分:0)
更好的方法取决于您想要持有的状态以及您想要使用的状态。如果没有考虑到这一点,你就可以说出来,那么就不可能制定一个更好的方法来制定它。设置颜色是你唯一想做的事情吗?您是否需要在应用程序中将常规JButton与ColorButton混合使用?