2010-02-03 79 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