我有一个可编辑的JComboBox,每当文本更改时,我想要采取一些操作,无论是通过键入还是选择。在本例中,文本是一个模式,我想验证该模式是否有效,并显示产生一些测试数据的匹配项。
在执行了显而易见的附加ActionHandler之后,我发现,对于输入,事件似乎不可靠地触发,充其量也就是触发(选择也可以)。当它由于输入而触发时,检索到的文本(使用getEditor().getItem(),因为getSelectedItem()只在从列表中选择时才获取文本)似乎是触发最后一个事件时的文本-也就是说,它总是缺少在操作事件触发之前输入的字符。
我期望动作事件会在短暂的延迟(500ms到1秒)后触发,但它似乎是在按键时立即触发(如果它被触发的话)。
我能想到的唯一可行的替代方案是,简单地在焦点获得时启动1秒计时器,在焦点丢失时终止它,如果内容与上次不同,则将工作作为计时器操作。
有什么想法或建议吗?
代码片段并不是特别有趣:
find.addActionListener(this);
...
public void actionPerformed(ActionEvent evt) {
System.out.println("Find: "+find.getEditor().getItem());
}
发布于 2009-08-10 02:09:45
动作侦听器通常仅在您按enter键或将焦点从组合框的编辑器上移开时触发。拦截对编辑器的单个更改的正确方法是注册文档侦听器:
final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent();
tc.getDocument().addDocumentListener(this);
每当支持编辑器的文档被修改时,DocumentListener interface都会调用这些方法(insertUpdate、removeUpdate、changeUpdate)。
您还可以使用匿名类对事件的来源进行更细粒度的控制:
final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent();
tcA.getDocument().addDocumentListener(new DocumentListener() {
... code that uses comboA ...
});
final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent();
tcB.getDocument().addDocumentListener(new DocumentListener() {
... code that uses comboB ...
});
发布于 2012-12-06 20:57:53
你可以使用类似这样的东西:
JComboBox cbListText = new JComboBox();
cbListText.addItem("1");
cbListText.addItem("2");
cbListText.setEditable(true);
final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent();
tfListText.addCaretListener(new CaretListener() {
private String lastText;
@Override
public void caretUpdate(CaretEvent e) {
String text = tfListText.getText();
if (!text.equals(lastText)) {
lastText = text;
// HERE YOU CAN WRITE YOUR CODE
}
}
});
发布于 2016-12-11 14:52:40
这听起来是最好的解决方案
jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here:
} });
https://stackoverflow.com/questions/1252698
复制相似问题