2015-06-13 132 views
0


我有這個代碼,我設計了一個editable JComboBox來收聽我的keyPressed事件,並顯示一條消息,說明按下了按鍵。但我不知道爲什麼這不起作用。 作爲初學者,我可能在邏輯/概念上出錯。可編輯的JComboBox KeyPressed不工作

因此,我會請求關於如何構建代碼的建議,以便它能夠正常工作。

import javax.swing.*; 
import java.awt.*; 

public class testEJCBX extends JFrame { 
    JComboBox jcbx = new JComboBox(); 

    public testEJCBX() { 
     super("Editable JComboBox"); 
     jcbx.setEditable(true); 

     getContentPane().setLayout(new FlowLayout()); 
     getContentPane().add(jcbx); 

     jcbx.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) 
      { 
       jcbxKeyPressed(evt); 
      } 
     }); 

     setSize(300, 170); 
     setVisible(true); 
    } 
    private void jcbxKeyPressed(java.awt.event.KeyEvent evt) {          
     JOptionPane.showMessageDialog(null, "Key Pressed"); 
    } 

    public static void main(String argv[]) { 
     new testEJCBX(); 
    } 
} 
+0

'KeyListener'是一個糟糕的選擇一般,但在你的情況下,'KeyEvent's AREN」被髮送到'JComboBox',而被髮送到作爲'JComboBox'的編輯器的組件。你試圖達到什麼目標? – MadProgrammer

+0

我只是想在'Editable JComboBox'內按下任何按鍵時收到一條消息。 – mustangDC

+0

該怎麼辦?或者更確切地說,我應該如何實現這個目標? – mustangDC

回答

3

你不應該使用這樣的事情一個KeyListener的代碼。相反,如果你想檢測對組合框的編輯器組件,將其解壓縮並添加的DocumentListener到它:

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 
import java.awt.*; 

public class TestEJCBX extends JFrame { 
    JComboBox<String> jcbx = new JComboBox<>(); 

    public TestEJCBX() { 
     super("Editable JComboBox"); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     jcbx.setEditable(true); 

     getContentPane().setLayout(new FlowLayout()); 
     getContentPane().add(jcbx); 

     JTextField editorComponent = (JTextField) jcbx.getEditor() 
      .getEditorComponent(); 

     Document doc = editorComponent.getDocument(); 
     doc.addDocumentListener(new DocumentListener() { 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      System.out.println("text changed"); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      System.out.println("text changed"); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      System.out.println("text changed"); 
     } 
     }); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String argv[]) { 
     new TestEJCBX(); 
    } 
} 
+0

雖然這是正確的,我沒有問題,如果OP試圖以某種方式修改該字段,它會導致突變異常。我「懷疑」他們正在嘗試創建一個自動完成的字段,但我不知道:P – MadProgrammer

+2

@MadProgrammer:當然是。我假設他只是爲了通知而不是突變。爲了進行變異,他可以使用DocumentFilter,否則他可以作弊,使用DocumentListener,將變異代碼放入Runnable中,並將其排列到事件線程中。 –

+0

正如我所說的,我沒有任何證據或方法:P – MadProgrammer