Java和Swing非常新,我一直在使用swing gui应用程序。它为我的组合框生成了一些代码:
comboBox.addActionListener(EventHandler.create(ActionListener.class, TestController, "changeSomething"));
我也有:
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
public class StudyPlanController {
private JComboBox factors;
public void changeSomething() {
JOptionPane.showMessageDialog(null, "change!");
}
}
我有两个问题。
当我在组合框中更改所选项目时,我收到消息“更改!”只是第一次改变。这是为什么?
在Google搜索解决方案时,设置监听器的所有代码都与为我生成的代码不同。 e.g
box.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ System.out.println(e.getItem()+“”+ e.getStateChange()); } });
我创建听众的方式是否正确?为什么有两种方法可以做到这一点?
由于
答案 0 :(得分:2)
对于JComboBox更好的实现ItemListener,但此Listener始终被调用两次SELECTED
和DESELECTED
,您可以检查if是否为{{} 1}}
SELECTED/DESELECTED
您可以使用ActionListener,但我建议您使用它来更改自己的 myComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
//some stuff
}
}
});
属性或方法,而不是从JComboBox's
转移到GUI的某处
你可以使用EventHandler,但更好的是在
之前开始学习基本的东西答案 1 :(得分:2)
首先回答一下关于EventHandler的问题。通常事件处理是在@mKorbel说的那样完成的。对于许多事件侦听器类,会在事件上调用特定方法。这可能导致许多匿名内部类。因此引入了 EventHandler 。使用反射更有效,并创建更少的对象。见http://docs.oracle.com/javase/7/docs/api/java/beans/EventHandler.html
其次,为什么会出错:我希望:
comboBox.addItemListener(ItemListener.class, textController, "doSomething");
正如@mKorbel所说,由于SELECTED测试,最好不要在这里使用EventHandler。
答案 2 :(得分:0)
除了给出的答案之外,我还遇到了Netbeans生成的代码问题 - 如果我们打破它就会隐藏它! 虽然Builder获得了快速的GUI设置 - 并且它的优秀功能,但我生成了错误的事件代码。 我现在习惯于不使用Builder添加事件,但有一个“自己编写”的方法来设置它们 - 特别是在这种情况下使用上面的优秀建议。