2

我有一个 JComboBox。我使用以下代码添加了一个 ActionListener:


addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textComboActionPerformed(evt);
            }
        });

这是它第一次显示时的样子。它有几个选项。
替代文字

您会注意到 Basic Text Box 是第一个元素,因此它将是第一次显示 JComboBox 时显示的元素。

如果单击 JComboBox,您将看到其下可用的选项。

替代文字

但是,如果我选择“基本文本框”,它不会导致 ActionEvent 触发。它与它是列表中的第一个元素有关。如果我选择任何其他 JComboBox,则会触发 ActionEvent。

编辑:在 Linux 上,假设您选择了一个元素,事件就会触发。然后再次选择该元素,它不会第二次触发。它不仅限于第一个元素。它与两次选择已选择的元素有关。

这种行为只发生在 Linux 上。在 Windows 上,无论我点击哪个元素,即使是第一个,事件都会触发。关于为什么会这样的任何想法?这种行为是否因 JVM 不同而异?

谢谢

4

1 回答 1

2

首先,我认为要使用的正确监听器是ItemListener(而不是ActionListener)。

正如您在评论中所说,这为您提供了跨平台的一致行为:当已选择的项目被“重新选择”时,您根本不会收到事件。这正是 ItemListener 根据JavaDocs应该如何工作的:

aListener 将在所选项目更改时收到一两个 ItemEvent 。

当您选择已选择的相同值时,显然您不会更改该值,因此不会触发任何事件。但是,这显然不是您想要的。作为替代方案,我建议在没有预选项目的情况下显示 JComboBox:

JComboBox comboBox = new JComboBox(model);
comboBox.setSelectedItem(null);

我不知道这对您的应用程序是否可行,但这样一来,只要选择了实际值,您肯定会收到一个事件。(我认为,从可用性的角度来看,这也更有意义,因为为什么非专家点击组合框来选择已经选择的值?)

于 2010-12-08T14:59:35.483 回答