在处理侦听器时,我总是看到这样的代码。
@SuppressWarnings("serial")
public class Test extends JPanel{
public Test() {
JPanel a = new JPanel();
a.add(checkBoxMaker("foo"));
add(a);
}
public JCheckBox checkBoxMaker(String name){
JCheckBox b = new JCheckBox(name);
// Like this (better)
b.addItemListener(e -> System.out.println(e.getStateChange()));
// Or like this
b.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange());
}
});
return b;
}
}
我认为更好的方式是这样:
@SuppressWarnings("serial")
public class Test extends JPanel{
private ItemListener listener;
public Test() {
// So
listener = e -> System.out.println(e.getStateChange());
// or so
listener = new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange());
}
};
JPanel a = new JPanel();
a.add(checkBoxMaker("foo"));
add(a);
}
public JCheckBox checkBoxMaker(String name){
JCheckBox b = new JCheckBox(name);
b.addItemListener(listener); //same listener declared once above
return b;
}
}
在第一个片段中,您可以看到每个Checkbox创建都会创建一个带有new关键字的ItemListener实例,我猜这会很慢,并且会占用内存。而我的版本声明了一次Itemlistener,并在创建复选框时使用它。
我认为实例化一次总比连续实例化几次要好。
所以我的问题是:我的思考方式和与听众合作的方式有没有更好的地方?
额外的问题: GUI应用程序中的边框怎么办?声明一个边框并在UI上多次使用它是否比每次都使用JComponent的BorderFactory创建一个边框更有效?
问候
发布于 2021-03-17 22:29:00
您的方式避免了创建额外的侦听器对象,这一点是正确的。
但是,除非你有一个真正疯狂的复选框数量,否则这根本无关紧要。Java程序分配了成千上万的对象。多多少少不是任何人都会注意到的事情。
你的方法的缺点是,只有当所有的监听器都是相同的时,它才能起作用。通常,您会希望侦听器执行特定于该控件的操作。在使用checkbox控件的情况下,您可能希望它在其他对象上设置特定的标志。所以现在的监听器不同了: Foo复选框监听器调用Something.setFoo
,Baz复选框监听器调用Something.setBaz
。或者,也许监听器只是不同,因为它们从上下文中捕获了不同的值。
https://stackoverflow.com/questions/66680777
复制相似问题