Java 如何获取已写入可编辑JComboBox的值?
我一直在搜索,似乎每个人都只使用Java 如何获取已写入可编辑JComboBox的值?,java,jcombobox,Java,Jcombobox,我一直在搜索,似乎每个人都只使用JComboBox#getSelectedItem。但是我的组合框是可编辑的,用户可以输入任何内容。getSelectedItem方法返回组合框中的一个实际项目,而不是字段中输入的字符串 如果我的框包含“Bar”和“Item”,并且用户输入“Foo”,那么我想得到“Foo” 为什么getSelectedItem不起作用 有人指出,getSelectedItem也会返回输入的字符串。不过,没有人指出,这只有在用户停止编辑字段后才起作用。我附加了这些事件侦听器: C
JComboBox#getSelectedItem
。但是我的组合框是可编辑的,用户可以输入任何内容。getSelectedItem
方法返回组合框中的一个实际项目,而不是字段中输入的字符串
如果我的框包含“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
如您所见,操作事件侦听器可以捕获值,但键事件无法捕获。这样:
combobox.getEditor().getItem()
。画得不错。您使用的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);
JComboBox组合=新的JComboBox(新字符串[]{“bar”,“item”});
combo.setEditable(真);
JButton按钮=新JButton(“Get”);
addActionListener((ActionEvent e)->{
System.out.println(combo.getSelectedItem());
});
JFrame=新JFrame();
frame.setLayout(新的FlowLayout());
frame.getContentPane().add(组合);
frame.getContentPane().add(按钮);
frame.pack();
frame.setVisible(true);
如果您在选择一个预定义项目后单击按钮,它将打印该项目,如果您输入一些文本,然后按下按钮,它将打印该文本。
getSelectedItem
对我来说似乎工作正常。也许你应该给我们看一些代码。实际上,你能把为你工作的代码发布到某个地方吗?而且,看起来它是:我已经澄清了为什么getSelectedItem
不工作。类似的重复问题确实要求“从JComboBox获取输入值”,这让人觉得它在要求其他东西。也许这就是我没有找到它的原因。我对此进行了研究,结果表明,如果您在更改值时尝试获取值,那么您的解决方案将不起作用(字段具有焦点)。我在每次按键事件后检索字段值。@TomášZato,这已经晚了一年,但我会更正以供将来参考:当你说“我在每次按键事件后检索字段值”时,我希望你不是字面上的“按键事件”。基于关键事件的触发可能更难实现,并不总是有效,并且会导致问题。相反,将DocumentListener
附加到JComboBox
的基础Comboxeditor
组件的基础Document
:((JTextComponent)yourComboBox.getEditor().getEditorComponent()).getDocument().addDocumentListener(yourDocumentListener)代码>我也支持Tomás所说的,在文本被键入时,这个功能不起作用。只有当按下[Enter]键或当JComboBox
失去焦点时,更改才会合并到SelectedItem
,换句话说,只有在JComboBox
失去焦点时才会合并到SelectedItemStateChanged
和ActionPerformed
:@TomášZato Yea,你可能应该改变这种情况。对于输入中未更改的内容,可能会发生状态更改,这意味着您调用的changed()
方法远远超出了您的需要。尽管我不确定,由于状态更改侦听器在那里,您的ActionPerformed
也可能是多余的,因为状态更改可能是而且可能是由ActionPerformed
触发的即使不是这样,一个DocumentListener
仍然是正确的选择,因为你只需要一个而不是两个监听器,使事情更容易管理、重构等等。。。