Java swing组合框只调用一次监听器

时间:2011-12-19 11:19:15

标签: java swing

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!");
    }
}

我有两个问题。

  1. 当我在组合框中更改所选项目时,我收到消息“更改!”只是第一次改变。这是为什么?

  2. 在Google搜索解决方案时,设置监听器的所有代码都与为我生成的代码不同。 e.g

    box.addItemListener(new ItemListener(){     public void itemStateChanged(ItemEvent e){         System.out.println(e.getItem()+“”+ e.getStateChange());     } });

  3. 我创建听众的方式是否正确?为什么有两种方法可以做到这一点?

    由于

3 个答案:

答案 0 :(得分:2)

对于JComboBox更好的实现ItemListener,但此Listener始终被调用两次SELECTEDDESELECTED,您可以检查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添加事件,但有一个“自己编写”的方法来设置它们 - 特别是在这种情况下使用上面的优秀建议。