如何将Swing事件从内部组件传播到容器?

时间:2010-02-03 09:56:50

标签: java swing events

我基于包含文本字段和复选框的JPanel创建了一个组件。由于我将它用作组件并将其放在其他面板中,我希望能够为面板设置KeyPressed事件。显然,这不适用于内部文本字段的keyPressed事件。有没有办法将它们传播到JPanel,因为它接收它们而不是文本字段?我尝试使用handleEvent,但它甚至没有编译。


让我们澄清这个问题。我创建了包含文本字段的大元素。现在想在另一个中使用这个元素,我想将OTHER ONE设置为监听器。所以之间有JPanel。这就是问题所在。

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

您可以将JPanel衍生物作为事件侦听器添加到JTextField。

您需要做一些管道才能使其工作,例如使您的JPanel衍生工具实现KeyListener并实现所需的方法。

答案 2 :(得分:0)

尝试将ActionListener添加到JPanel。当用户在JTextfield中按下键时,将调用ActionListener中的actionPerformed()方法。您可以在事件对象上调用getSource()以确定事件是否由于JTextField中的操作而被触发并相应地执行。