Actionlistener java как подключить

Пакет java.awt

Обработка пользовательских событий

Весь предыдущий раздел » Дерево компонентов» был посвящен заданию внешнего вида пользовательского интерфейса. Однако до сих пор он был статическим. Перейдем теперь к рассмотрению правил обработки различных событий, которые могут возникать как результат действий пользователя, и не только.

Событие ActionEvent

Рассмотрим появление события ActionEvent на примере нажатия на кнопку.

Предположим, в нашем приложении создается кнопка сохранения файла:

Объявим класс, который реализует этот интерфейс:

Все необходимое для обработки нажатия пользователем на кнопку сделано. Ниже приведен полный листинг программы:

События AWT

Классы сообщений ( event ) содержат вспомогательную информацию для обработки события. Метод getSource() возвращает объект-источник события. Конкретные наследники AWTEvent могут иметь дополнительные методы. Например, MouseEvent сообщает о нажатии кнопки мыши, а его методы getX и getY возвращают координаты точки, где это событие произошло.

Рассмотрим обзорно все события AWT и соответствующих им слушателей, определенных в Java начиная с версии 1.1.

MouseMotionListener и MouseEvent
MouseListener и MouseEvent

Как правило, первая кнопка соответствует левой кнопке мыши.

KeyListener и KeyEvent
FocusListener и FocusEvent

Интерфейс FocusListener содержит два метода – focusGained и focusLost (получен/потерян).

TextListener и TextEvent
ItemListener и ItemEvent
AdjustmentListener и AdjustmentEvent
WindowListener и WindowEvent

Это событие сигнализирует об изменении состояния окна (класс Window и его наследники).

ComponentListener и ComponentEvent
ContainerListener и ContainerEvent

Это событие позволяет отслеживать изменение списка содержащихся в этом контейнере компонент.

С развитием Java в AWT появляются и другие события, например, позволяющие поддерживать колесико мыши. Однако все они работают по точно такой же схеме, а потому их можно легко освоить самостоятельно.

Обработка событий с помощью внутренних классов

Еще в лекции, посвященной объявлению классов, было указано, что в теле класса можно объявлять внутренние классы. До сих пор такая возможность не была востребована в наших примерах, однако обработка событий AWT – как раз удобный случай рассмотреть такие классы на примере анонимных классов.

Предположим, в приложение добавляется кнопка, которой следует добавить слушателя. Зачастую бывает удобно описать логику действий в отдельном методе того же класса. Если вводить слушателя, как делалось раньше – в отдельном классе, то это сразу порождает ряд неудобств: появляется новый, малосодержательный класс, которому к тому же необходимо передать ссылку на исходный класс и так далее.

Гораздо удобнее поступить следующим образом:

Пример приложения, использующего модель событий

В заключение темы, посвященной событиям, рассмотрим пример приложения, которое активно их использует.

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

Источник

События и слушатели

Listener находится в постоянном ожидании, пока в источнике, в котором он зарегистрирован, не наступит соответствующее событие, при возникновении которого слушатель получает управление. Также слушателю передается объект события (источник), чтобы он смог правильно на него отреагировать. Таким образом, источник вызывает метод-обработчик события, определенный в классе, являющемся блоком прослушивания. В качестве блоков прослушивания иногда используют внутренние классы. В этом случае в методе, регистрирующем блок прослушивания в качестве параметра, используется объект этого внутреннего класса.

После обработки события слушатель возвращает управление. Таким образом, для обработки события вызываются только те слушатели, которые на него «подписались», т.е. были зарегистрированы источником.

Типы событий и слушателей

В пакете java.awt.event определены интерфейсы слушателей для каждого из определенных в нем типов событий (например, для событий MouseEvent определено два интерфейса слушателей: MouseListener и MouseMotionListener). Все интерфейсы слушателей событий являются расширениями интерфейса java.util.EventListener. В этом интерфейсе не определяется ни один из методов, но он играет роль базового интерфейса, в котором однозначно определены все слушатели событий как таковые.Т.е. слушатель наследуется от интерфейса EventListener и предназначен для обработки определенного типа событий. При этом Listener содержит один или несколько методов, которые принимают объект события в качестве единственного параметра и вызываются в определенных ситуациях.

Интерфейс слушателя событий Listener может включать несколько методов. Например, класс событий, подобный MouseEvent, описывает несколько событий, связанных с мышью, таких как события нажатия и отпускания кнопки мыши. Эти события вызывают различные методы соответствующего слушателя.

READ  Фотоэлементы came dir10 как подключить

В таблице приведены определенные в пакете 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

Классов-адаптеров всего семь. Кроме уже упомянутых трех классов, это классы 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

Пример использования слушателя ActionListener

Интерфейс приложения представлен на рисунке.

Программный вызов события

Событие вызывается автоматически, при наступлении определенных условий. Но можно событие создать и вызвать программно (fire event).

В предыдущий пример были внесены изменения во внутренний класс TestActionListener, в результате чего по нажатию на кнопку button3 создается и вызывается новое событие.

После нажатия на кнопку button3 в консоли будет выведена следующая информация :

Источник

Принципы обработки событий

Содержание

Введение

Почему в некоторых случаях многократное нажатие на кнопку не приводит ни к какому результату? Проектируя программы с графическим интерфейсом при помощи набора компонентов Swing, необходимо разбираться в модели обработки событий. Для создания интерфейса, взаимодействующего с пользователем, недостаточно просто разместить компоненты на экране.

Модель обработки событий из набора компонентов Swing ассоциирует каждый компонент с его наблюдателем таким образом, чтобы при возникновении события об этом уведомлялись все его наблюдатели. Наблюдатель можно назвать объектом, «заинтересованным» в возникновении события. Узнать о наблюдателях, применяемых для некоторых событий компонента, мы сможем на примере Swing.

При использовании компонентов Swing наблюдателей называют слушателями событий. Они должны реализовывать пустой интерфейс java.util.EventListener, а также (почти во всех случаях) интерфейс слушателя подкласса, который должен иметь хотя бы один метод. События остаются событиями, однако они должны создавать подкласс класса java.util.EventObject. Чрезвычайно важно знать, с какими событиями компонента ассоциированы определенные слушатели событий.

Прежде чем начать изучение принципа поиска событий, ассоциированных с компонентами, рассмотрите частный случай – выбор кнопки JButton. За данное действие отвечает событие ActionEvent, которое генерируется при выборе пользователем кнопки JButton. Если какой-либо объект заинтересован в происхождении данного события, его необходимо зарегистрировать для кнопки JButton.

READ  Как подключить две видеокарты одновременно

Для события ActionEvent регистрация проводится по форме ActionListener. Имена в ней связаны соответствующим образом, а для каждого события формы ABCEvent ассоциированным слушателем является ABCListener, где вместо ABC указывается конкретный тип события.

Регистрация происходит при вызове метода addActionListener. Каждый зарегистрированный реализатор уведомляется путем передачи (при генерации события ActionEvent) реализации интерфейса слушателя методу addActionListener. У одного события может быть несколько наблюдателей.

Весь процесс представлен следующими пунктами (хотя порядок их следования может меняться).

Определить для заданного события класс, реализующий связанный с ним интерфейс. В существующее определение класса можно добавить строку «implements ABCListener» или создать новый класс, реализующий данный интерфейс.

Добавления в определение класса строки «implements ABCListener» недостаточно. Кроме этого необходимо реализовать каждый метод данного интерфейса. У одних слушателей (например, ActionListener) есть только один метод. У других (например, WindowListener, используемого при перемещении или закрытии окна) – несколько. Код можно компилировать тогда, когда определены все методы слушателей. Однако и это еще не все. Для того чтобы программа должным образом реагировала на события необходимо выполнить последнее действие.

После определения реализации интерфейса необходимо создать экземпляр реализации и ассоциировать его с компонентом. Только после этого наблюдатель (слушатель) сможет получать уведомления о возникновении соответствующих событий.

В данной программе продемонстрирован случай обработки события «выбор кнопки»:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class MyActionListener implements ActionListener <
public void actionPerformed ( ActionEvent e ) <
System.out.println ( «Thank you.» ) ;
>
>

public class SelectMe extends JFrame <

public static void main ( String args []) <
JFrame frame = new SelectMe () ;
frame.show () ;
>
>

Как узнать, какие события инициируются каждым из компонентов? Ответ на этот вопрос можно найти в документации по API. Взгляните еще раз на пару методов add/removeABCListener, в которых вместо ABC указывается тип события. Для каждой пары методов add/remove будет сгенерировано отдельное событие. Для того чтобы отключить отправку уведомления о происхождении события используйте метод removeABCListener.

Рассмотрим класс JButton с целью определения, какие еще события можно «услышать». В документации API по классу JButton сказано, что кнопка может реагировать и на отсутствие события. В данном классе нет методов add/remove. Это один из случаев, когда используются принципы объектно-ориентированного программирования. Необходимо взглянуть в суперкласс AbstractButton. Множество его поведений используется совместно несколькими выбираемыми Swing компонентами, таким образом, базис кода обработки событий переносится на уровень выше.

На уровне AbstractButton слушателями, ассоциируемыми с классом Jbutton, кроме ActionListener могут быть ChangeListener и ItemListener.

Для успешной работы с компонентами и ассоциированными с ними наблюдателями событий вам потребуется выяснить, для чего предназначен каждый слушатель. В то время как ActionListener используется для указания на то, что компонент выбран, ChangeListener указывает на изменение каких-либо свойств кнопки.

Свойства компонента описывают его состояние. Свойствами класса JButton являются текстовая метка, фоновый и основной цвета, а также шрифт. При изменении одного из свойств уведомляются все зарегистрированные слушатели ChangeListener, причем, информация о названии измененного свойства в событии не передается. Слушатель PropertyChangeListener выполняет те же функции и, кроме этого, указывает на измененное свойство.

В следующей программе к предыдущему примеру ActionListener добавлен слушатель ChangeListener. При запуске программы можно увидеть, что слушатель ChangeListener неоднократно получает уведомления. Каждое изменение состояния инициирует отправку уведомления. В нашем примере во время настройки фонового цвета и рамки компонента его состояние изменяется множество раз.

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

class MyActionListener implements ActionListener <
public void actionPerformed ( ActionEvent e ) <
System.out.println ( «Thank you.» ) ;
>
>

class MyChangeListener implements ChangeListener <
public void stateChanged ( ChangeEvent e ) <
System.out.println ( «You’re welcome.» ) ;
>
>

public class SelectMe extends JFrame <

public static void main ( String args []) <
JFrame frame = new SelectMe () ;
frame.show () ;
>
>

Как уже упоминалось ранее, с классом JButton можно ассоциировать также слушатель ItemListener. Но на этом обработка событий кнопки не заканчивается. Двигаясь дальше, мы столкнемся с суперклассом JComponent для класса AbstractButton.

Для класса JComponent родительским будет класс Container, чьим родительским классом будет, соответственно, класс Component. На каждом из данных уровней иерархии имеется свой набор слушателей, которые можно ассоциировать с кнопкой. У класса java.lang.Object таких слушателей нет.

Далее перечислены все возможные события, которые инициирует класс JButton и которые можно «услышать».

java.awt.Component: ComponentListener, FocusListener, HierarchyBoundsListener, HierarchyListener, InputMethodListener, KeyListener, MouseListener, MouseMotionListener, MouseWheelListener, PropertyChangeListener

java.awt.Container: ContainerListener, PropertyChangeListener javax.swing.JComponent AncestorListener, PropertyChangeListener, VetoableChangeListener

javax.swing.AbstractButton: ActionListener, ChangeListener, ItemListener

Список мог показаться вам чрезмерно большим, однако, не торопитесь с выводами. В большинстве случаев слушатель ActionListener просто ассоциируется с кнопкой, что позволяет ему отслеживать событие.

READ  Мтс приморье как подключить везде как дома

Списки слушателей для большинства компонентов оказываются столь же длинными. Вам понадобится время и опыт, чтобы научиться выбирать из них подходящие элементы.

Теперь вы можете проверить полученные знания относительно обработки событий с помощью нашего он-лайн теста.

Классы Adapter

API AWT и Project Swing определяют интерфейсы, называемые слушателями. У каждого типа события есть интерфейс слушателя, а у каждого слушателя есть методы для каждого возможного события.

Интерфейс слушателя требует от вас замены всех его абстрактных методов на методы, определенные в вашем классе. Даже если вам не нужны все эти методы, вы должны будете реализовать их, не устанавливая в теле кода какого-либо содержимого. При таком подходе код получается запутанным и на его написание затрачивается больше времени (в некоторых интерфейсах присутствует порядка семи абстрактных методов).

Например, интерфейс MouseListener сконструирован для того, чтобы получать для компонента события мыши (press, release, click, enter, exit). Для использования интерфейса 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)

Если для вашего приложения требуется переопределить только один из этих методов, то необходимо будет также реализовать и остальные. Избежать реализации методов пустого интерфейса можно путем использования классов adapter.

Классы adapter обеспечивают пустую реализацию всех методов интерфейса слушателя событий. Новый класс, действующий как слушатель событий, определяется путем расширения одного из классов adapter, что позволяет вам переопределять только интересующие вас методы.

В качестве следующего примера мы создадим приложение с двумя кнопками. При наведении на кнопку мышью в текстовом поле должно появляться имя кнопки. В данном приложении расширяется класс MouseAdapter, таким образом, вместо всех пяти в интерфейсе MouseListener реализовано только два метода:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MouseAdapterExample extends JFrame <
JButton button1, button2;
JTextField tf;

public MouseAdapterExample () <
// открыть конструктор

// создать кнопки и добавить слушателей
button1 = new JButton ( «Button 1» ) ;
button1.setName ( «Button 1» ) ;
button1.addMouseListener ( new MouseHandler ()) ;
button2 = new JButton ( «Button 2» ) ;
button2.setName ( «Button 2» ) ;
button2.addMouseListener ( new MouseHandler ()) ;

// Создать текстовое поле, в котором
// пользователь не сможет вводить текст
tf = new JTextField ( 25 ) ;
tf.setEditable ( false ) ;

// создать панели, добавить кнопки и текстовое поле
JPanel p1 = new JPanel () ;
p1.setBackground ( Color.white ) ;
p1.add ( button1 ) ;
p1.add ( button2 ) ;

JPanel p2 = new JPanel () ;
p2.setBackground ( Color.white ) ;
p2.add ( tf ) ;

public void mouseExited ( MouseEvent me ) <
// Когда мышь покидает область кнопки
// значение в текстовом поле сбрасывается.

public static void main ( String args []) <
MouseAdapterExample mae = new MouseAdapterExample () ;
>
>

// Данный класс расширяет класс adapter и
// переопределяет только один метод: windowClosing. Вместо
// того, чтобы использовать данный класс для закрытия окна,
// вы можете добавить в код еще одну строку:
// setDefaultCloseOperation(EXIT_ON_CLOSE);
// как показано ранее в примере SelectMe.
class WinClosing extends WindowAdapter <
public void windowClosing ( WindowEvent we ) <
System.exit ( 0 ) ;
>
>

Интерфейс KeyListener и абстрактный класс KeyAdapter

События клавиатуры также можно отслеживать. Для получения такого рода событий используется интерфейс KeyListener. Объекты-слушатели регистрируются для таких компонентов, как окно или панель, при помощи метода addKeyListener компонента.

Класс, заинтересованный в обработке событий клавиатуры, или реализует данный интерфейс вместе со всеми его методами, или же расширяет абстрактный класс KeyAdapter. В последнем случае вы можете переопределить только те методы, которые имеют значение для приложения.

В качестве примера в следующем приложении создается объект, который устанавливает, вводятся ли с клавиатуры какие-либо символы. Введенный текст отображается в метке внизу экрана:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyAdapterExample extends JFrame <
// Метка, отображающая введенный текст.
JLabel label;
// Окно, в котором перемещается мышь и вводится текст
JPanel p;

public KeyAdapterExample () <
label = new JLabel ( «You typed: » ) ;

p = new JPanel () ;
p.setBackground ( Color.white ) ;
// Зарегистрировать введенный символ
p.addKeyListener ( new KeyHandler ()) ;
// Зарегистрировать перемещение мыши в области глухой панели
p.addMouseListener ( new MyMouseAdapter ( p )) ;

// Класс, обрабатывающий набор символов
class KeyHandler extends KeyAdapter <
// Метод, извлекающий набранные символы и
// устанавливающий их в качестве значений метки
public void keyTyped ( KeyEvent ke ) <
label.setText ( «You typed: » + ke.getKeyChar ()) ;
label.invalidate () ;
invalidate () ;
validate () ;
>
>

public void mousePressed ( MouseEvent e ) <
c.requestFocus () ;
>

private Component c;
>

public static void main ( String args []) <
KeyAdapterExample kae = new KeyAdapterExample () ;
>
>

Источник

Поделиться с друзьями
Как подключить и установить...
Adblock
detector