Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取已写入可编辑JComboBox的值?_Java_Jcombobox - Fatal编程技术网

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
仍然是正确的选择,因为你只需要一个而不是两个监听器,使事情更容易管理、重构等等。。。