问题
I keep searching and it seems like everybody is using only the JComboBox#getSelectedItem
. But my combo box is editable and the user can enter anything. The getSelectedItem
method returns one of the actual items in the combo box, not a string entered in the field.

If my box contains "Bar" and "Item" and user enters "Foo", I want to get "Foo"!
Why getSelectedItem
does not work
It was pointed out that getSelectedItem
does also return the string entered. It was not pointed out though, that this only works after the user stops editing the field. I attached these event listeners:
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();
}
});
And this were the results:
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
As you can see, the action event listener could capture the value, but the key event could not.
回答1:
This way: combobox.getEditor().getItem()
. Nice drawing.
回答2:
Maybe there is something wrong in the way you are using getSelectedItem
. For me, this seems to work just fine:
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);
If you click the button after selecting one of the predefined items, it prints that item, and if you enter some text and then press the button, it prints that text.
来源:https://stackoverflow.com/questions/29104743/how-to-get-value-that-has-been-written-in-editable-jcombobox