2009-08-10 86 views
18

我有一个编辑的JComboBox,我想,通过输入或选择采取一些动作,当文字被改变。在这种情况下,文本是一种模式,我想验证该模式是否有效,并显示导致某些测试数据的匹配项。如何知道可编辑JComboBox的文本何时更改?

做完明显,附加一个的ActionHandler,我发现,打字,事件似乎不可靠火,充其量(选择是罚款)。而当它确实火打字的结果,文字检索(使用getEditor()。getItem()时,因为getSelectedItem()只得到,当它被从列表中选择文本)似乎是文本,因为它是当最后一个事件被触发时 - 也就是说,它始终缺少在操作事件被触发之前键入的字符。

我期待的动作事件的一些短暂的延迟(500毫秒到1秒)之后触发,但似乎立刻在键控射击(如果在所有的发射)。

我能想到的唯一可行的选择是简单地启动焦点获得的1秒定时器,在焦点丢失时将其消灭,并在内容与上次不同时执行定时器动作。

任何想法或建议?

的代码片段是不是特别有趣:

find.addActionListener(this); 
... 
public void actionPerformed(ActionEvent evt) { 
    System.out.println("Find: "+find.getEditor().getItem()); 
    } 

回答

30

,当你按下回车键,或移动从ComboBox的编辑焦点离开动作监听器通常仅被解雇。拦截到编辑器个别变化的正确的方法是注册的文档侦听:

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 ... 
}); 
+0

谢谢,我会试试看。我不介意Swing作为一个整体,但有时候弄清楚如何获得某些行为或者捕捉某些事件是** FAR **显而易见的。 – 2009-08-10 20:19:28

+0

好了,撇开方法调用的“19”的水平...具有所添加的文档侦听器,在事件发生时我能找到没有办法将比分扳成到两个组合框被改变。在这一点上,一个简单的计时器看起来非常有吸引力。 – 2009-08-11 05:27:55

+0

我存储了两个认证机构的最后一个已知文本,并使用它来确定文档事件触发时发生了哪些变化。如果您知道如何将事件绑定到触发它的组件,这将是有用的信息 - 因为DocumentEvent不是标准的AWT事件或java.util.EventObject。 – 2009-08-11 05:55:18

0

您可以使用财产以后这样的:

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 
     } 
    } 
}); 
-1

这听起来像的最佳解决方案

jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() { 
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here: 

} }); 
+1

这会错过不使用键盘所做的更改(例如,使用定位设备粘贴或删除文本)。 – Martin 2017-08-01 10:59:46

相关问题