我基于包含文本字段和复选框的JPanel创建了一个组件。由于我将它用作组件并将其放在其他面板中,我希望能够为面板设置KeyPressed事件。显然,这不适用于内部文本字段的keyPressed事件。有没有办法将它们传播到JPanel,因为它接收它们而不是文本字段?我尝试使用handleEvent,但它甚至没有编译。
让我们澄清这个问题。我创建了包含文本字段的大元素。现在想在另一个中使用这个元素,我想将OTHER ONE设置为监听器。所以之间有JPanel。这就是问题所在。
答案 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中的操作而被触发并相应地执行。