JComboBox选择更改侦听器?


145

每当尝试从中进行选择时,我都试图触发一个事件JComboBox

我遇到的问题是没有明显的addSelectionListener()方法。

我尝试使用actionPerformed(),但从未触发。

没有覆盖的模型JComboBox,我没有想法。

如何通知有关JComboBox** 选择更改的通知?**

编辑:我要道歉。事实证明,我使用了行为异常的子类JComboBox,但是由于您的回答是好的,因此我将保留该问题。


很好的问题,因为我已经注意到actionPerformed会在加载组合框时触发,而不是在选择期望时框。
Brian Knoblauch 2013年

Answers:


160

它应该响应ActionListeners,如下所示:

combo.addActionListener (new ActionListener () {
    public void actionPerformed(ActionEvent e) {
        doSomething();
    }
});

@John Calsbeek正确地指出了也addItemListener()可以。ItemEvents但是,您可能会得到2 ,一个用于取消选择先前选择的项目,另一个用于选择新项目。只是不要同时使用两种事件类型!


45
我希望使用ItemListener(只需确保检查ItemEvent来查看它是选择还是取消选择)。即使未更改选择(即用户单击已选择的项目),也可以触发ActionListener。这可能是您想要的,也可能不是。
丹·代尔

6
我知道这个问题很旧,但是为了补充,如果调用addItem方法,也会触发ActionListener。
加百利·卡马拉2015年

150

ItemListener实现的代码示例

class ItemChangeListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // do something with object
       }
    }       
}

现在,我们将仅获得选定的项目。

然后只需将侦听器添加到您的JComboBox

addItemListener(new ItemChangeListener());

2
我尝试了这段代码,一个问题是,当我单击已选择的项目时,将不会触发侦听器,因为没有状态更改。
dmark '16

4
@dmark我认为这是合理的,因为什么都没有改变。也许您应该以某种方式重新组织您的行动,以不依赖于这种情况。
Viacheslav

@dmark谢谢,您的评论帮助我解决了一个问题:)
Tia


11

这是创建一个ComboBox,为项目选择更改添加一个侦听器:

JComboBox comboBox = new JComboBox();

comboBox.setBounds(84, 45, 150, 20);
contentPane.add(comboBox);

JComboBox comboBox_1 = new JComboBox();
comboBox_1.setBounds(84, 97, 150, 20);
contentPane.add(comboBox_1);
comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        //Do Something
    }
});

3
这个答案增强了以前的答案,因为……?请不要重复!不相关:永远不要手动进行组件的大小确定/定位,这是合适的LayoutManager的专有任务
kleopatra 2013年

7

您可以尝试这些

 int selectedIndex = myComboBox.getSelectedIndex();

-要么-

Object selectedObject = myComboBox.getSelectedItem();

-要么-

String selectedValue = myComboBox.getSelectedValue().toString();

我知道为什么要降低投票率,但是我相信应该重新考虑那些降低投票率...如果您在actionPerformed方法中检查选定的索引,您会发现这可行。它确实会触发,并且排除-1事件将允许您排除启动时的错误触发。解决了我的问题!
Brian Knoblauch

4

我最近在寻找这种完全相同的解决方案,并设法找到一种简单的解决方案,而没有为最后选择的项目和新选择的项目分配特定的变量。这个问题虽然很有帮助,但没有提供我需要的解决方案。这解决了我的问题,希望它能解决您和其他人的问题。谢谢。

如何获得上一个或最后一个项目?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.