Как распространить события Swing из внутреннего компонента в контейнер? - PullRequest
0 голосов
/ 03 февраля 2010

Я создал компонент на основе JPanel, который содержит текстовое поле и флажок. Поскольку я использую его как компонент и помещаю в другие панели, я бы хотел установить событие KeyPressed для панели. Очевидно, что это не работает, поскольку события keyPressed запускаются для внутреннего текстового поля. Есть ли способ распространить их на JPanel, поскольку он получал их вместо текстового поля? Я пытался с handleEvent, но он даже не компилируется.


Давайте уточним вопрос. Я создал этот большой элемент, содержащий текстовое поле. Теперь я хочу использовать этот элемент в другом, и я хочу установить OTHER ONE в качестве слушателя. Таким образом, существует JPanel. Это проблема.

Ответы [ 3 ]

1 голос
/ 03 февраля 2010

Вы можете использовать javax.swing.event.EventListenerList в JPanel, содержащей JTextField, и создать открытый метод 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 голосов
/ 03 февраля 2010

Попробуйте добавить ActionListener в JPanel. Метод actionPerformed() в ActionListener будет вызван, когда пользователь нажмет клавишу в поле JText. Вы можете вызвать getSource() для объекта события, чтобы определить, произошло ли событие из-за действия в JTextField, и действовать соответственно.

0 голосов
/ 03 февраля 2010

вы можете добавить производную JPanel в JTextField в качестве прослушивателя событий.

Вам понадобится выполнить некоторые сантехнические работы, чтобы заставить это работать, например, заставить ваш производный JPanel реализовать KeyListener и реализовать необходимые методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...