Java: передать событие другому компоненту - PullRequest
1 голос
/ 07 апреля 2010

Извините, я не знаю, ясно ли это, но я довольно новичок в Java.

Итак, у меня есть JFrame с BorderLayout, содержащим JPanel и JButton.

Что я хочу сделать - это когда что-то происходит в моей JPanel, я хочу, например, изменить текст JButton или включить / отключить его. Как бы я это сделал? Как я могу получить доступ к JButton из JPanel? Я знаю несколько способов сделать это, но я не думаю, что это лучший способ сделать это.

Как лучше всего это сделать?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 07 апреля 2010

Самый простой случай - это когда ваш экземпляр JPanel и экземпляр JButton «видят» друг друга в вашем коде, т. Е .:

JButton button = new JButton ("Click me");
JPanel panel = new JPanel ();
...
container.add (button);
container.add (panel);

В этом случае вы можете добавить прослушиватель событий на панель (или на кнопку) и изменить второй компонент из обработчика событий:

panel.addMouseListener (new MouseAdapter () {
   public void mouseClicked (MouseEvent e) {
      button.setText ("new text");
   }

});

Единственное, что вы должны здесь учитывать, это то, что вы должны использовать модификатор final рядом с объявлением button (из-за того, что у java нет реальных замыканий):

final JButton button = new JButton ("Click me");
JPanel panel = new JPanel ();

panel.addMouseListener (new MouseAdapter () {
   ....
});

Более сложный случай, когда ваши компоненты не знают друг о друге или когда состояние системы изменяется, и состояние компонентов (например, имя кнопки или что-то более серьезное) также должно быть изменено. В этом случае вы должны рассмотреть возможность использования шаблона MVC. Вот очень хороший урок от JavaWorld: MVC встречает Swing .

0 голосов
/ 07 апреля 2010

Вы должны прослушать событие на вашей JPanel. JPanels может прослушивать нажатия клавиш (KeyListener), щелчки мыши (MouseListener) и движения мыши (MouseMovementListener). Какой из них вас интересует?

Как только вы знаете, что хотите слушать, вы должны написать и зарегистрировать слушателя и изменить что-то в JButton. Например:

// define JButton jb, JPanel jp, put one inside the other so that there is some
// free space to click on around the JPanel; declare both as final.
...

// listen to mouse clicks on the panel and updates the button's label
jp.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            jb.setText(jb.getText() + ".");
        }
});
...