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

3

我对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. 在搜索解决方案时,所有设置侦听器的代码与为我生成的代码不同。例如:

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

我创建侦听器的方式是否正确?为什么有两种方法来做到这一点?

谢谢

1
那段代码是用什么工具生成的? - jackrabbit
@jackrabbit - http://www.mindsilver.com/ - pingu
3个回答

2
对于 JComboBox,最好实现ItemListener,但是这个Listener总是被调用两次,一次是SELECTED,一次是DESELECTED,你可以检查一下事件是否为SELECTED/DESELECTED
   myComboBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                //some stuff
            }
        }
    });

你可以使用ActionListener,但我建议仅用于更改自身JComboBox的属性或方法,而不是从JComboBox到GUI之外的其他地方。
你可以使用EventHandler,但最好先学习基础知识。

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。

0
进一步说,我遇到了Netbeans生成的代码问题 - 它会将其隐藏起来以防我们破坏它! 虽然构建器可以快速设置GUI - 对于它所做的事情非常出色,但我遇到了错误的事件代码生成。 现在,我习惯于不使用构建器添加事件,而是使用自己编写的方法来设置这些事件 - 尤其是在这种情况下,使用了上面提供的优秀建议的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接