【问题标题】:How to get value that has been written in editable JComboBox?如何获取已写入可编辑 JComboBox 的值?
【发布时间】:2015-03-17 16:37:51
【问题描述】:

我一直在搜索,似乎每个人都只使用JComboBox#getSelectedItem。但我的组合框是可编辑,用户可以输入anythinggetSelectedItem 方法返回组合框中的实际项目之一,而不是在字段中输入的字符串。

如果我的盒子包含“Bar”和“Item”并且用户输入“Foo”,我想得到“Foo”!

为什么getSelectedItem 不起作用

有人指出getSelectedItem 也会返回输入的字符串。但没有指出,这仅在用户停止编辑字段后才有效。我附加了这些事件监听器:

Component[] comps = input.getComponents();
//Third is the text field component
comps[2].addKeyListener(new KeyListener() {
  public void keyTyped(KeyEvent e) {
    doSomething();
  }
});
//Also fire event after user leaves the field
input.addActionListener (new ActionListener () {
    @Override
    public void actionPerformed(ActionEvent e) {
      doSomething();
    }
});

结果如下:

KeyEvent:
 JComboBox.getEditor().getItem() = 6  
 JComboBox.getSelectedItem()     = null
KeyEvent:
 JComboBox.getEditor().getItem() = 66
 JComboBox.getSelectedItem()     = null
KeyEvent:
 JComboBox.getEditor().getItem() = 666
 JComboBox.getSelectedItem()     = null
ActionEvent:
 JComboBox.getEditor().getItem() = 6666
 JComboBox.getSelectedItem()     = 6666

如您所见,动作事件侦听器可以捕获值,但键事件不能。

【问题讨论】:

  • getSelectedItem 对我来说似乎工作得很好。也许你应该给我们看一些代码。
  • 实际上,你能把对你有用的代码贴在某个地方吗?
  • 另外,看起来它是一个副本:stackoverflow.com/questions/10072335/…
  • 我已经澄清了为什么getSelectedItem 不起作用。被链接的重复问题确实询问“Get input values from JComboBox”,这给人的印象是它在要求其他东西。也许这就是我没有找到它的原因。

标签: java jcombobox


【解决方案1】:

这边:combobox.getEditor().getItem()。画的不错。

【讨论】:

    【解决方案2】:

    您使用getSelectedItem 的方式可能有问题。对我来说,这似乎工作得很好:

    JComboBox<String> combo = new JComboBox<>(new String[] {"bar", "item"});
    combo.setEditable(true);
    
    JButton button = new JButton("Get");
    button.addActionListener((ActionEvent e) -> {
        System.out.println(combo.getSelectedItem());
    });
    
    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.getContentPane().add(combo);
    frame.getContentPane().add(button);
    frame.pack();
    frame.setVisible(true);
    

    如果您在选择其中一个预定义项目后单击按钮,则会打印该项目,如果您输入一些文本然后按下按钮,它将打印该文本。

    【讨论】:

    • 我对此进行了研究,结果发现如果您在更改值时尝试获取值(字段具有焦点),则您的解决方案将不起作用。我在每次按键事件后检索字段的值。
    • @TomášZato,这已经晚了一年,但无论如何我都会更正以供将来参考:当你说“我在每次按键事件后检索字段的值”时,我希望你不要字面意思是“按键事件”。基于关键事件的触发可能更难实现,并不总是有效并且会导致问题。相反,将DocumentListener 附加到JComboBox 的底层ComboBoxEditor 组件的底层Document((JTextComponent) yourComboBox.getEditor().getEditorComponent()).getDocument().addDocumentListener(yourDocumentListener);
    • 我也支持 Tomás 所说的在输入文本时这不起作用。更改仅在等效于 ActionPerformed 时合并到 SelectedItem,换句话说,仅当按下 [Enter] 或 JComboBox 失去焦点时。
    • @AlmightyR 显然我使用itemStateChangedactionPerformed: github.com/Darker/auto-client/blob/…
    • @TomášZato 是的,你可能应该改变它。状态变化可能发生在输入没有变化的事情上,这意味着您调用 changed() 方法的次数远远超过您的需要。尽管我不确定,因为状态更改侦听器在那里,您的ActionPerformed 也很可能是多余的,因为状态更改可能是并且很可能是由ActionPerformed 触发的。 --- 即使不是这样,DocumentListener 仍然是正确的选择,因为您只需要一个侦听器而不是两个侦听器,从而使事情更易于管理、重构等...
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 2014-12-10
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多