【问题标题】:JComboBox Selection Change Listener?JComboBox 选择更改监听器?
【发布时间】:2010-09-08 16:56:37
【问题描述】:

每当从JComboBox 中做出选择时,我都会尝试触发一个事件。

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

我尝试使用actionPerformed(),但它永远不会触发。

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

如何在JComboBox 上收到选择更改的通知?**

编辑:我必须道歉。事实证明我使用了 JComboBox 的行为不端的子类,但由于您的回答很好,所以我会留下这个问题。

【问题讨论】:

  • 很好的问题,因为我注意到 actionPerformed 在加载组合框时触发,而不是在选择预期的时间时触发。

标签: java swing jcombobox itemlistener


【解决方案1】:

它应该回复ActionListeners,像这样:

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

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

【讨论】:

  • 我更喜欢 ItemListener (只需确保检查 ItemEvent 以查看它是选择还是取消选择)。即使选择没有改变(即,如果用户单击已选择的项目),也可以触发 ActionListener。这可能是也可能不是您想要的。
  • 我知道这个问题很老了,但是为了补充,如果调用 addItem 方法也会触发 ActionListener。
【解决方案2】:

如果jodonnell的解决方案失败,我会尝试ItemListener接口的itemStateChanged()方法。

【讨论】:

    【解决方案3】:

    你可以试试这些

     int selectedIndex = myComboBox.getSelectedIndex();
    

    -或-

    Object selectedObject = myComboBox.getSelectedItem();
    

    -或-

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

    【讨论】:

    • 我知道为什么这被否决了,但我认为应该重新考虑那些被否决的……如果你在 actionPerformed 方法中检查选定的索引,你会发现这是可行的。它确实会触发,并且排除 -1 事件将允许您排除启动时的错误触发。解决了我的问题!
    • 一个有用的答案,如果只是作为 JComboBox 的适当方法的快速参考。
    【解决方案4】:

    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());
    

    【讨论】:

    • 我试过这段代码,一个问题是当我点击已经选中的项目时,不会触发监听器,因为没有状态改变。
    • @dmark 我认为这是合理的,因为没有任何改变。也许你应该以某种方式重新组织你的行动,以不依赖于这种情况。
    • @dmark 谢谢,你的评论帮我解决了一个问题 :)
    【解决方案5】:

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

    How do I get the previous or last item?

    【讨论】:

      【解决方案6】:

      这里正在创建一个 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
          }
      });
      

      【讨论】:

      • 这个答案增强了以前的答案......?请不要复制!无关:永远不要对组件进行任何手动调整大小/定位,这是合适的 LayoutManager 的专属任务
      【解决方案7】:

      你可以用 jdk >= 8 做到这一点

      getComboBox().addItemListener(this::comboBoxitemStateChanged);
      

      所以

      public void comboBoxitemStateChanged(ItemEvent e) {
          if (e.getStateChange() == ItemEvent.SELECTED) {
              YourObject selectedItem = (YourObject) e.getItem();
              //TODO your actitons
          }
      }
      

      【讨论】:

        【解决方案8】:

        我用这个:

            cb = new JComboBox<String>();
            cb.setBounds(10, 33, 46, 22);
            panelConfig.add(cb);
            for(int i = 0; i < 10; ++i)
            {
                cb.addItem(Integer.toString(i));
            }
            cb.addItemListener(new ItemListener()
            {
                @Override
                public void itemStateChanged(ItemEvent e)
                {
                    if(e.getID() == temEvent.ITEM_STATE_CHANGED)
                    {
                        if(e.getStateChange() == ItemEvent.SELECTED)
                        {
                            JComboBox<String> cb = (JComboBox<String>) e.getSource();
                            String newSelection = (String) cb.getSelectedItem();
                            System.out.println("newSelection: " + newSelection);
                        }
                    }
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 2011-12-20
          • 2013-04-01
          • 2011-09-03
          相关资源
          最近更新 更多