2013-04-02 3 views
2

У меня есть MainPanel. Он содержит SubPanel1, SubPanel2 и т. Д. SubPanel может иметь любую комбинацию JComponents, такую ​​как кнопки, переключатели, текстовые поля и т. Д. Одна подпанель может быть или не быть такой же, как другая.Прослушивание и реагирование на события внутри панели?

Как заставить MainPanel прослушивать и отвечать на действия, происходящие внутри подпанелей? Пожалуйста, покажите мне хороший пример с комментариями, который учит меня, как это сделать.

Фото -

enter image description here

+0

'SubPanel [] панели звучат как приличный старт. Затем просто перейдите по нему и примените к нему тот же ActionListener. – Shark

+0

@Shark - но источником (from getSource()) событий будут отдельные компоненты SubPanel, а не SubPanel.Я хочу знать, какая панель вызвала событие и обрабатывает события. –

+2

Вам действительно нужно прочитать [Как записывать прослушиватели событий] (http://docs.oracle.com/javase/tutorial/uiswing/components/label.html). Идея baid заключается в том, что вам либо нужно предоставить свой собственный интерфейс слушателя, либо позволить вашим панелям выступать в качестве прокси-сервера, выставляя слушателей, которых вы хотите разрешить людям регистрироваться (согласно моему предыдущему ответу). – MadProgrammer

ответ

3

Возможно, вы ищете observer pattern. Программы Java Swing могут использовать любой из нескольких способов реализации шаблона; приводятся некоторые примеры here. Поскольку компонент может принимать произвольное количество слушателей, одной из важных эвристических задач является поиск существующего компонента подпанели, который родитель может прослушивать. В конкретном случае суб-панелей также возможно, чтобы пересылал события слушателю родителя, как предложено here.

+0

Похоже, что качание не так просто. Возможно, я должен просто создать анонимный ActionLister для всех компонентов внутри основной панели. –

+0

Или используйте 'Action', показано [здесь] (http://stackoverflow.com/a/4039359/230513). – trashgod

+1

@ davidblaine Одной из главных особенностей Swing является его гибкость. Он не (часто) ограничивает вас определенным стилем или делает предположения о том, как вы можете использовать его компоненты. Тем не менее, это требует от вас усилий для создания серии библиотек в соответствии с вашими потребностями и потребностями. IMHO – MadProgrammer

0

Создание ваших слушателей действий в MainPanel и использовать то же самое в суб-панелей. Источник событий должен позволять вам идентифицировать вспомогательную панель, из которой генерируется событие.

+0

Можете ли вы также дать мне хороший и простой пример кода для этого? –

+0

Возможно, вы захотите пройти этот учебник: http://docs.oracle.com/javase/tutorial/uiswing/events/ –

1

Код собрана из Oracle JavaSE Tutorial:

public class Beeper ... implements ActionListener { 
... 
//where initialization occurs: 
    //notice this line 
    button.addActionListener(this); 
... 
public void actionPerformed(ActionEvent e) { 
    ...//Make a beep sound... 
} 
} 

Это, как вы обычно зарегистрировать обработчик право ???

это означает здесь ???

button.addActionListener(this); 

Это означает, вызовите текущий объект (который этот относится) * actionPerformed метод всякий раз, когда действие происходит с этим кнопки объекта. Так что, если вы передаете ваш MainPanel «s ссылке, а это и ваша главная панель имеет метод actionPerformed и реализует ActionListener *, когда кнопка стреляет в событие, ваши главные окна *actionPerformed ** будет называться.

Так изменил эту строку следующим образом:

button.addActionListener(RefOfMainPanel); 

Это все. Да, это так просто :)

Смежные вопросы