2010-02-03 95 views
0

我創建了一個基於JPanel的組件,該組件包含一個文本框和一個複選框。由於我將它用作組件並將其放在其他面板中,我希望能夠爲面板設置KeyPressed事件。 Obiouvsly這不起作用keyPressed事件爲內部文本字段啓動。有沒有辦法將它們傳播到JPanel,因爲它正在接收它們而不是文本字段?我嘗試了handleEvent,但它甚至沒有編譯。如何傳播從內部組件到容器的Swing事件?


讓我們來澄清一下問題。我創建了這個包含文本字段的大元素。現在想在另一箇中使用此元素,並且我想將OTHER ONE設置爲偵聽器。所以它們之間有JPanel。那就是問題所在。

回答

1

您可以在包含JTextField的JPanel中使用javax.swing.event.EventListenerList,並創建addKeyListener公共方法。

import javax.swing.event.EventListenerList; 

public static class TestPanel extends JPanel implements KeyListener{ 
    private JTextField text; 
    private EventListenerList listenerList = new EventListenerList(); 

    TestPanel(){ 
     text = new JTextField(); 
     text.addKeyListener(this); 
    } 

    public void keyPressed(KeyEvent e){ 
     //doesn't create a new array, used for performance reasons 
     Object[] listeners = listenerList.getListenerList(); 
     //Array of pairs listeners[i] is Class, listeners[i + 1] is EventListener 
     for (int i = listeners.length - 2; i >= 0; i -= 2) { 
      if (listeners[i] == KeyListener.class) { 
       ((KeyListener)listeners[i+1]).keyPressed(e); 
      }   
     } 
    } 

    public void addKeyListener(KeyListener l) { 
     listenerList.add(KeyListener.class, l); 
    } 

    public void keyReleased(KeyEvent e){ 
     //idem as for keyPressed   
    } 

    public void keyTyped(KeyEvent e){ 
     //idem as for keyPressed 
    } 
} 
+0

我看到與此唯一的問題是該事件泄漏對其他私人JTextField的引用。看起來,用JPanel作爲源構建一個新的KeyEvent並將其發送給偵聽器將是更完整的解決方案。 – Dev 2014-05-09 19:17:31

0

您可以將JPanel派生作爲事件偵聽器添加到JTextField中。

您需要做一些準備工作才能使其發揮作用,例如讓您的JPanel派生實現KeyListener並實現所需的方法。

+0

Views.Components.FieldColorato不能轉換爲java.awt.event.KeyListener ...應該實現接口嗎?請參閱澄清 – gotch4 2010-02-03 10:11:17

+0

是的,請參閱編輯... – pstanton 2010-02-03 10:14:28

+0

是的,但是如果我這樣做,JPanel將捕獲事件,而不是包含JPanel的元素,不是嗎? – gotch4 2010-02-03 10:30:42

0

嘗試將ActionListener添加到JPanel。當用戶按下JTextfield中的鍵時,ActionListener中的actionPerformed()方法將被調用。您可以在事件對象上調用getSource()以確定事件是否由於JTextField中的操作而被觸發並採取相應措施。

+0

看到澄清 – gotch4 2010-02-03 10:14:36

相關問題