2013-02-21 2 views
1

Я написал небольшой код в java для simpleGUI.обработка событий в java и выполнение actionPerformed method в java

package guidemo1; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class GuiDemo1 implements ActionListener{ 
JButton button; 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     GuiDemo1 gui=new GuiDemo1(); 
     gui.go(); 
    } 

    public void go() 
    { 
     JFrame frame=new JFrame(); 
     button=new JButton(); 
     frame.getContentPane().add(button); 
     button.addActionListener(this); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     button.setText("I've been clicked"); 
    } 
} 

Я новичок в JAVA.I имеет несколько вопросов, связанных с этой программой.

Может ли кто-нибудь объяснить, как метод actionPerformed выполняется с любым вызовом?

Здесь я определил объект рамки локально для метода go(), и мы используем кнопку в actionPerformed, которая является другим методом. Как это возможно? Не входит ли кнопка в рамку?

Спасибо ..

+0

Будучи орудиями ActionListener, actionPerformed() переопределяется так, любое действие переходит к actionPerformed() без какого-либо вызова ... –

ответ

1

Может кто-нибудь объяснить, как метод actionPerformed выполняется с любым вызовом?

Структура GUI Swing запускает код обработки действий в фоновом режиме. Всякий раз, когда нажата кнопка или пользователь взаимодействует с графическим интерфейсом каким-либо другим способом, Swing уведомит ваше приложение через один из многих интерфейсов Listener. Для того, чтобы получить эти события, ваш класс должен реализовать надлежащий Listener интерфейс и быть зарегистрирован в качестве слушателя на каждом компоненте он заинтересован в.

Ваш класс реализует интерфейс ActionListener и призывает addActionListener зарегистрировать себя кнопку. Когда нажимается кнопка, Swing будет пытаться уведомить всех зарегистрированных ActionListener s, вызвав их метод actionPerformed. Так происходит «волшебство».

Здесь я определил объект рамки локально для метода go(), и мы используем кнопку в actionPerformed, которая является другим методом. Как это возможно? Разве кнопка не вставлена ​​в рамку?

Вам add кнопку на панели содержимого фрейма - это помещает кнопку внутри рамки в вашей макет, а не в код. Поскольку вы объявляете button в качестве переменной экземпляра, помещая JButton button; вне любого метода, он по-прежнему доступен из любого метода (не static) в этом классе.

3

Ваш класс реализует ActionListener, так что вы должны определить метод actionPerformed. Вы также вызываете button.addActionListener(this), который регистрирует текущий объект в качестве слушателя для нажатия кнопки.

При запуске события нажатия кнопки все слушатели будут уведомлены, включая объект, который вы зарегистрировали в качестве слушателя.

+2

Не уверен, что это может быть частью ответа, но OP также следует посмотреть в «Шаблон наблюдателя». –

+0

(nb - Кнопки могут иметь более одного слушателя. Я считаю, что понятие «обработчик» немного ошибочно - IMHO) – MadProgrammer

+0

@MadProgrammer Заменил «обработчик» на «прослушиватель». –

3

Добро пожаловать в среду, управляемую событиями.

В этой среде вы регистрируете «слушателей», которые ждут, когда что-то произойдет, а затем сообщит вам через четко определенную структуру интерфейса.

В основном, что происходит, вы зарегистрировались как заинтересованная сторона для действий, которые могут возникнуть на кнопке. Вы сделали это, реализовав интерфейс ActionListener. Это позволяет кнопке, когда выполняется какое-либо действие, чтобы вернуться к вашему методу actionPerformed в будущем.

Это широко известный как шаблон наблюдателя.

Вы могли бы найти Writing Event Listeners полезным прочитать

1

Что касается второго вопроса, Java является ссылкой язык. Все объекты находятся в куче и живы, пока кто-то держит ссылку на них.

В Swing корпус немного сложнее. Библиотека Swing содержит ссылки на все элементы GUI (такие как JFrame и JButton), поэтому они не удаляются, даже если вы больше не ссылаетесь на них.

Что касается первого вопроса, посмотрите, что делает основной поток - он создает новый объект GuiDemo1, вызывает метод go(), который создает JFrame, и отображает этот фрейм. Существует специальный поток Swing, Thread Dispatch Thread, который ждет в фоновом режиме событий в графическом интерфейсе. Отображение кадра запускает EDT, который затем отображает рамку и спит. Основной поток, завершив всю работу в основном методе, затем DIES.

Теперь у вас отображается JFrame и сообщение об отключении Event Dispatch. EDT теперь ожидает взаимодействия пользователя (события) с JFrame - Swing управляется событиями. Каждый раз, когда вы взаимодействуете с фреймом, Swing создает для него событие и пробуждает EDT для обработки события. Например, если вы нажмете кнопку, EDT просыпается, анимирует кнопку «кликнуть» и вызывает всех прослушивателей действий. То, когда вызывается метод actionPerformed.

+0

Swing библиотека держится в смысле? Есть ли класс, который содержит эти ссылки? – user12458

+0

Я думаю, что edt - это нить пользователя, а не фоновый поток. – user12458

0
  • реализации ActionListener

  • добавить ActionListener к интерфейсу

  • добавить метод actionPerformed к классу

  • установить таймер и запустить его в классе

, который сделает это

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