- События и слушатели
- Типы событий и слушателей
- Классы-адаптеры, Adapter
- Описание класса-адаптера действий с мышью, MouseAdapter
- События, связанные с визуальными компонентами AWT
- Регистрация слушателя Listener
- Пример использования слушателя ActionListener
- Программный вызов события
- Java JButton Tutorial with ActionListener Programming Examples
- Constructors
- Methods
- Programming Example
- Action Listener
- Summary
События и слушатели
Событие Event — это объект, описывающий изменение состояния источника, с которым оно связано. Примером события, в котором участвует пользователь, являются нажатие кнопки, выбор элемента из списка, ввод символа с клавиатуры и т.д. Событие может происходить и без участия пользователя при использовании таймера.
Слушатель Listener — это уведомляемый о некотором событии объект. Чтобы слушатель смог реагировать на определенное событие источника он должен быть им зарегистрирован, т.е. подключен к источнику. Listener должен реализовывать определенные методы для получения и обработки уведомлений о событии.
Listener находится в постоянном ожидании, пока в источнике, в котором он зарегистрирован, не наступит соответствующее событие, при возникновении которого слушатель получает управление. Также слушателю передается объект события (источник), чтобы он смог правильно на него отреагировать. Таким образом, источник вызывает метод-обработчик события, определенный в классе, являющемся блоком прослушивания. В качестве блоков прослушивания иногда используют внутренние классы. В этом случае в методе, регистрирующем блок прослушивания в качестве параметра, используется объект этого внутреннего класса.
После обработки события слушатель возвращает управление. Таким образом, для обработки события вызываются только те слушатели, которые на него «подписались», т.е. были зарегистрированы источником.
Типы событий и слушателей
В пакете java.awt.event определены интерфейсы слушателей для каждого из определенных в нем типов событий (например, для событий MouseEvent определено два интерфейса слушателей: MouseListener и MouseMotionListener). Все интерфейсы слушателей событий являются расширениями интерфейса java.util.EventListener. В этом интерфейсе не определяется ни один из методов, но он играет роль базового интерфейса, в котором однозначно определены все слушатели событий как таковые.Т.е. слушатель наследуется от интерфейса EventListener и предназначен для обработки определенного типа событий. При этом Listener содержит один или несколько методов, которые принимают объект события в качестве единственного параметра и вызываются в определенных ситуациях.
Интерфейс слушателя событий Listener может включать несколько методов. Например, класс событий, подобный MouseEvent, описывает несколько событий, связанных с мышью, таких как события нажатия и отпускания кнопки мыши. Эти события вызывают различные методы соответствующего слушателя.
В таблице приведены определенные в пакете java.awt.event типы событий, соответствующие им слушатели, а также методы, определенные в каждом интерфейсе слушателя.
Класс события | Интерфейс слушателя | Обработчики события |
---|---|---|
ActionEvent | ActionListener | actionPerformed(ActionEvent e) |
AdjustmentEvent | AdjustmentListener | adjustmentValueChanged(AdjustmentEvent e) |
ComponentEvent | ComponentListener | componentResized(ComponentEvent e) |
componentMoved(ComponentEvent e) | ||
componentShown(ComponentEvent e) | ||
componentHidden(ComponentEvent e) | ||
ContainerEvent | ContainerListener | componentAdded(ContainerEvent e) |
componentRemoved(ContainerEvent e) | ||
FocusEvent | FocusListener | focusGained(FocusEvent e) |
focusLost(FocusEvent e) | ||
ItemEvent | ItemListener | itemStateChanged(ItemEvent e) |
KeyEvent | KeyListener | keyPressed(KeyEvent e) |
keyReleased(KeyEvent e) | ||
keyTyped(KeyEvent e) | ||
MouseEvent | MouseListener | mouseClicked(MouseEvent e) |
mousePressed(MouseEvent e) | ||
mouseReleased(MouseEvent e) | ||
mouseEntered(MouseEvent e) | ||
mouseExited(MouseEvent e) | ||
MouseMotionListener | mouseDragged(MouseEvent e) | |
mouseMoved(MouseEvent e) | ||
TextEvent | TextListener | textValueChanged(TextEvent e) |
WindowEvent | WindowListener | windowOpened(WindowEvent e) |
windowClosing(WindowEvent e) | ||
windowClosed(WindowEvent e) | ||
windowIconified(WindowEvent e) | ||
windowDeiconified(WindowEvent e) | ||
windowActivated(WindowEvent e) |
Корнем иерархии классов событий является суперкласс EventObject из пакета java.util. Данный класс содержит два метода: getSource(), возвращающий источник событий, и toString(), возвращающий строчный эквивалент события. Чтобы узнать, в каком объекте произошло событие, нужно вызвать метод getSource(), возвращающий значение типа object. Следовательно, один и тот же слушатель можно подключить к разным источникам.
Классы-адаптеры, Adapter
Для каждого интерфейса слушателей событий, содержащего несколько методов, в пакете java.awt.event определен класс-адаптер Adapter. Когда нужен только один или два таких метода, иногда проще получить подкласс класса-адаптера, чем реализовать интерфейс самостоятельно. При использовании адаптера требуется лишь переопределить те методы, которые нужны, а при прямой реализации интерфейса необходимо определить все методы, в том числе и ненужные в данной программе.
Заранее определенные классы-адаптеры называются также, как и интерфейсы, которые они реализуют. Но в этих названиях Listener заменяется на Adapter; например MouseAdapter, MouseMotionAdapter, WindowAdapter и т.д.
Описание класса-адаптера действий с мышью, MouseAdapter
public abstract class MouseAdapter implements MouseListener < public void mouseClicked(MouseEvent e)<>public void mousePressed(MouseEvent e)<> public void mouseReleased(MouseEvent e)<> public void mouseEntered(MouseEvent e)<> public void mouseExited(MouseEvent e)<> > public abstract class MouseMotionAdapter implements MouseMotionListener < public void mouseDragged(MouseEvent e)<>public void mouseMoved(MouseEvent e)<> >
Классов-адаптеров всего семь. Кроме уже упомянутых трех классов, это классы ComponentAdapter, ContainerAdapter, FocusAdapter и KeyAdapter.
События, связанные с визуальными компонентами AWT
В следующей таблице приведен список визуальных компонентов пакета AWT и событий, которые они порождают.
Компонент | Событие | Описание |
---|---|---|
Button | ActionEvent | Пользователь нажал кнопку |
CheckBox | ItemEvent | Пользователь установил или сбросил флажок |
CheckBoxMenuItem | ItemEvent | Пользователь установил или сбросил флажок рядом с пунктом меню |
Choice | ItemEvent | Пользователь выбрал элемент списка или отменил его выбор |
Component | ComponentEvent | Элемент либо перемещен, либо он стал скрытым, либо видимым |
FocusEvent | Элемент получил или потерял фокус ввода | |
KeyEvent | Пользователь нажал или отпустил клавишу | |
MouseEvent | Пользователь нажал или отпустил кнопку мыши, либо курсор мыши вошел или покинул область, занимаемую элементом, либо пользователь просто переместил мышь или переместил мышь при нажатой кнопке мыши | |
Container | ContainerEvent | Элемент добавлен в контейнер или удален из него |
List | ActionEvent | Пользователь выполнил двойной щелчок мыши на элементе списка |
ItemEvent | Пользователь выбрал элемент списка или отменил выбор | |
MenuItem | ActionEvent | Пользователь выбрал пункт меню |
Scrollbar | AdjustmentEvent | Пользователь осуществил прокрутку |
TextComponent | TextEvent | Пользователь внес изменения в текст элемента |
TextField | ActionEvent | Пользователь закончил редактирование текста элемента |
Window | WindowEvent | Окно было открыто, закрыто, представлено в виде пиктограммы, восстановлено или требует восстановления |
Регистрация слушателя Listener
Для регистрации слушателя источник использует специальные методы. Как правило, имена методов имеют форму addXxxListener(XxxListener listener) или setXxxListener(XxxListener listener), где Xxx — это имя события, а listener — ссылка на слушателя событий.
Пример использования слушателя ActionListener
package test; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class TestFrame extends JFrame < private static final long serialVersionUID = 1L; private JTextField textField; private JButton button1; private JButton button2; private JButton button3; public TestFrame() < super("Test frame"); createGUI(); >public void createGUI() < setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); button1 = new JButton("Button 1"); button1.setActionCommand("Button 1 was pressed!"); panel.add(button1); button2 = new JButton("Button 2"); button2.setActionCommand("Button 2 was pressed!"); panel.add(button2); button3 = new JButton("Button 3"); button3.setActionCommand("Button 3 was pressed!"); panel.add(button3); textField = new JTextField(); textField.setColumns(23); panel.add(textField); ActionListener actionListener = new TestActionListener(); button1.addActionListener(actionListener); button2.addActionListener(actionListener); button3.addActionListener(actionListener); getContentPane().add(panel); setPreferredSize(new Dimension(320, 100)); >public class TestActionListener implements ActionListener < public void actionPerformed(ActionEvent e) < textField.setText(e.getActionCommand()); >> public static void main(String[] args) < javax.swing.SwingUtilities.invokeLater(new Runnable() < public void run() < JFrame.setDefaultLookAndFeelDecorated(true); TestFrame frame = new TestFrame(); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); >>); > >
Интерфейс приложения представлен на рисунке.
Программный вызов события
Событие вызывается автоматически, при наступлении определенных условий. Но можно событие создать и вызвать программно (fire event).
В предыдущий пример были внесены изменения во внутренний класс TestActionListener, в результате чего по нажатию на кнопку button3 создается и вызывается новое событие.
public class TestActionListener implements ActionListener < public void actionPerformed(ActionEvent e) < JButton button = (JButton) e.getSource(); System.out.println (button.getText() + ", " + e.getActionCommand()); if (e.getSource() != button3) < textField.setText(e.getActionCommand()); >else < ActionEvent e1 = new ActionEvent(button2, Event.MOUSE_DOWN, "Button 2 was pressed programmatically!"); ActionListener[] listeners; listeners = button2.getActionListeners(); listeners[0].actionPerformed(e1); >> >
После нажатия на кнопку button3 в консоли будет выведена следующая информация :
Button 3, Button 3 was pressed! Button 2, Button 2 was pressed programmatically!
Java JButton Tutorial with ActionListener Programming Examples
Java JButton in swing is used for performing action when clicked on it. This action might be getting data from input field, saving or retrieving data to database or performing and displaying calculation result in swing frame. Following classes and methods are used for implementing JButton in Swing.
Constructors
Constructor | Description |
---|---|
JButton() | It creates a button with no text and icon. |
JButton(String s) | It creates a button with the specified text. |
JButton(Icon i) | It creates a button with the specified icon object. |
Methods
Methods | Description |
---|---|
void setText(String s) | It is used to set specified text on button |
String getText() | It is used to return the text of the button. |
void setEnabled(boolean b) | It is used to enable or disable the button. |
void setIcon(Icon b) | It is used to set the specified Icon on the button. |
Icon getIcon() | It is used to get the Icon of the button. |
void setMnemonic(int a) | It is used to set the mnemonic on the button. |
void addActionListener (ActionListener a) | It is used to add the action listener to this object. |
Programming Example
package Test.MainJava.com; import javax.swing.*; public class JButton_Example < public static void main(String[] args) < JFrame frame=new JFrame(); JButton b=new JButton("Click Me");//creating instance of JButton b.setBounds(140,100,120, 40);//x axis, y axis, width, height frame.add(b);//adding button in JFrame frame.setSize(400,500);//400 width and 500 height frame.setLayout(null);//using no layout managers frame.setVisible(true);//making the frame visible >>
Output:
Action Listener
This was the simple JButton example that performed nothing when clicking on it. Now, I will add action listener so, this button will perform some action on clicking.
package Test.MainJava.com; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public FirstAppxample < public static void main(String[] args) < JFrame frame=new JFrame(); JButton b=new JButton("Click Me");//creating instance of JButton b.setBounds(140,100,120, 40);//x axis, y axis, width, height b.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e) < JOptionPane.showMessageDialog(null, "Hello World"); >>); frame.add(b);//adding button in JFrame frame.setSize(400,500);//400 width and 500 height frame.setLayout(null);//using no layout managers frame.setVisible(true);//making the frame visible > >
Output
package Test.MainJava.com; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class JButton_Example < public static void main(String[] args) < JFrame frame=new JFrame(); JButton b=new JButton("Click Me");//creating instance of JButton b.setBounds(140,100,120, 40);//x axis, y axis, width, height b.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e) < showmessage(); >>); b.addActionListener(null); frame.add(b);//adding button in JFrame frame.setSize(400,500);//400 width and 500 height frame.setLayout(null);//using no layout managers frame.setVisible(true);//making the frame visible > public static void showmessage() < JOptionPane.showMessageDialog(null, "Hello World"); >>
Output
package Test.MainJava.com; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class JButton_Example < protected JButton b1, b2; protected JFrame frame; public void TrackButton() < b1=new JButton("Button1"); b1.setBounds(140,100,120,40); b1.addActionListener(actions); b2=new JButton("Button2"); b2.setBounds(140,150,120,40); b2.addActionListener(actions); frame=new JFrame(); frame.add(b1); frame.add(b2); frame.setSize(400, 500); frame.setLayout(null); frame.setVisible(true); >private ActionListener actions = new ActionListener() < @Override public void actionPerformed(ActionEvent e) < if(e.getSource() == b1) < msg1(); >else if(e.getSource() == b2) < msg2(); >> >; public void msg1() < JOptionPane.showMessageDialog(null, "I am Button 1"); >public void msg2() < JOptionPane.showMessageDialog(null, "I am Button 2"); >public static void main(String[] args) < JButton_Example jb=new JButton_Example(); jb.TrackButton(); >>
Output
Summary
In this tutorial you learn how to play with JButton in Swing Application. I have tried to explain JButton with suitable, easy and complete programming example. In the next chapter you will learn some inputs field of Swing like JTextField, JPasswordField, JTextArea and JLabel