Button click event in java

JButton кнопка — обработка нажатия

Каждое приложение, которое имеет графический интерфейс пользователя не может обходиться без кнопок. В Java Swing кнопка представлена классом JButton. У кнопки имеются различные методы для ее конфигурирования — установка надписи на JButton, установка иконки, выравнивание текста, установка размеров и так далее. Кроме всего прочего разработчику необходимо навесить на JButton слушателя, который будет выполняться как только пользователь нажмет на кнопку. Как это сделать? Поговорим об этом ниже.

Ранее я писал, что все взаимодействия пользователя с приложением основано на событиях. Не является исключением и JButton. Как только пользователь нажимает кнопку, создается ActionEvent событие, которое передается слушателям кнопки. Для того, чтобы организовать слушателя Swing предоставляет интерфейс ActionListener, который необходимо реализовать. Интерфейс ActionListener требует только реализации одного метода — actionPerformed. Пример класса, реализующего интерфейс ActionListener представлен ниже.

public class TestActionListener implements ActionListener < public void actionPerformed(ActionEvent e) < //Код, который нужно выполнить при нажатии >>

После того, как обработчик создан, его необходимо добавить к кнопке. Делается это при помощи метода addActionListener. В качестве параметра методу передается обработчик. Например, это можно сделать вот так:

JButton button = new JButton("Test button"); ActionListener actionListener = new TestActionListener(); button.addActionListener(actionListener);

Здесь мы создаем сначала кнопку. Потом создаем экземпляр нашего слушателя TestActionListener, а затем добавляем его в качестве слушателя к кнопке с помощью вызова addActionListener и передаем ему экземпляр обработчика. Вообще слушателей может быть неопределенное количество. Если нам будет необходимо два или более слушателей, которые должны будут по-разному реагировать на нажатие кнопки, то для каждого из них вызовем addActionListener. Кроме того может когда-нибудь понадобиться отключить слушателя и сказать ему, чтобы он больше не прослушивал нажатие кнопки. Это можно сделать при помощи метода removeActionListener. Сюда в качестве параметра придется передать ссылку на слушателя, которого хотим удалить из списка слушателей кнопки JButton.

Ну и напоследок пример приложения для демонстрации обработчиков нажатия кнопки JButton.

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 JTextField textField; public TestFrame() < super(«Test frame»); createGUI(); >public void createGUI() < setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); JButton button1 = new JButton(«Button 1″); button1.setActionCommand(«Button 1 was pressed!»); panel.add(button1); JButton button2 = new JButton(«Button 2″); button2.setActionCommand(«Button 2 was pressed!»); panel.add(button2); JButton 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(new ActionListener() < public void actionPerformed(ActionEvent e) < textField.setText(e.getActionCommand()); >>); 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); >>); > >

Стоит сказать про несколько интересных на мой взгляд моментов. Первый — это использование action command. Можно заметить, что у кнопок вызывается метод setActionCommand, в который для каждой кнопки передает своё строковое значение. Таким образом в приложении можно понять, какая именно кнопка была нажата, если обработку нажатия нескольких кнопок выполняет один слушатель. Для того, чтобы узнать это у ActionEvent берется action command с помощью метода getActionCommand.

Читайте также:  Java jdbc postgresql url

Второй момент — для обработки события нажатия кнопки JButton можно создать анонимный класс, который реализует интерфейс ActionListener. Это можно наблюдать вот здесь:

button3.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e) < textField.setText(e.getActionCommand()); >>);

Share this:

Понравилось это:

Похожее

28 Responses to JButton кнопка — обработка нажатия

Я не понял, а как различить события и на разные события повесить разные экшены? Например, события наведения на кнопку, нажатия, получения фокуса и так далее. За статью спасибо, с удовольствием читаю.

ActionListener нужен только для обработки нажатия кнопки. Для прослушки мышиных событий (навел курсор мышки, убрал и так далее) нужен MouseListener. Для этого необходим класс, который реализует MouseListener (или анонимный). Создаем экземпляр такого класса и передаем в метод addMouseListener кнопки. Чтобы прослушивать фокусные события, делаем реализацию для FocusListener и добавляем слушателя с помощью addFocusListener.
P.S. Попробую в ближайшее время запостить про обработку мышиных и фокусных событий.

У меня возникла необходимость по нажатии JButton запустить некоторый бесконечный цикл. Причем в цикле должен перерисовываться JFrame, на котором этот JButton расположен. Проблема в том, что JFrame не перерисовывается, пока не отработает ActionListener. Подскажите направления решения этой задачи, пожалуйста.

Меня тоже интересует вопрос с перерисовкой для решения задачи:
есть JPanel и две JButton (+ и -). нажимаешь на кнопку + на JPanel добавляется новая Jlabel, нажимаешь на — удаляется последняя добавленная Jlabel.

Есть варварский способ +) зато быстрый и надежный
берете ваш JFrame jf и в ActionListener пишите
jf.remove(Component comp)
jf.setVisible(false)
jf.setVisible(true) где comp может быть и панель и кнопа и все что угодно =)

Здравствуйте.
Ради развлечения начал изучать Java.
Не подскажете, почему листенер кнопки не может поменять текст на ней? В примере при слово «Test» только мелькает после отпускания ЛКМ.
btn.setText(«Button»);
btn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) btn.setText(«Test»);
>
>);

Читайте также:  Python decode binary string

Подскажите пожалуйста как организовать обработку таким образом, что при нажатии кнопки открывалось окно из этого проекта?

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

A не подскажите как чделать что бы при нажатии на кнопку выводилост изображение созданое в методе Graphics?

Пожалуйста, поменяйте ваш некомпилируемый код на:
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 JTextField textField; public TestFrame() super(«Test frame»);
createGUI();
> public void createGUI() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel();
panel.setLayout(new FlowLayout()); JButton button1 = new JButton(«Button 1»);
button1.setActionCommand(«Button 1 was pressed!»);
panel.add(button1); JButton button2 = new JButton(«Button 2»);
button2.setActionCommand(«Button 2 was pressed!»);
panel.add(button2); JButton 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(new ActionListener() public void actionPerformed(ActionEvent e) textField.setText(e.getActionCommand());
>
>); 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);
>
>);
>
>

Есть проблема. В программе есть несколько кнопок и JCkeckbox, от выбора последнего завист какую картинку-иконку повесить на кнопки. Но, картинки не присваиваються,хотя майн выполняется в отдельном потоке, а после выбора присутствует перерисовка панели содержашая кнопки. Может сможетеиразобраться, компилятор ошибок не выдает , он просто не отрисовыает картинки(

Такой вопрос. Обработчик начинает выполнять действие когда нажимаешь на кнопку. нажал и отпустил — и после того как отпустил начинает работать. Подскажите как сделать что бы срабатывал сразу после касания, а не после отпускания? мож команда какая? проект в эклипсе

В MouseListener 2 метода есть: mouseClicked и mousePressed , одна из них работает вроде бы как вы хотите.

не пойму что не так. Ошибку выдает на этом месте :
ActionListener actionListener = new Maska(); public class Mass < JButton b1,b2;
JLabel l1,l2;
JTextField t1; public static void main (String[]args ) < JPanel p1 = new JPanel();
FlowLayout f1 = new FlowLayout();
p1.setLayout(f1); JButton b1 = new JButton(«Поиск»);
JButton b2 = new JButton(«Очистить»);
JLabel l1 = new JLabel(«Ведите слово для поиска»);
JLabel l2 = new JLabel(«»);
JTextField t1 = new JTextField(10); ActionListener actionListener = new Maska();
b1.addActionListener(actionListener); p1.add(l1);
p1.add(t1);
p1.add(b1);
p1.add(b2);
p1.add(l2); JFrame Fr = new JFrame(«Поисковик»);
Fr.setContentPane(p1); Fr.setSize(300,100);
Fr.setVisible(true); >
public class Maska implements ActionListener String [] m =;
public void actionPerformed(ActionEvent e) < if (e.getSource()== b1)< for (int x = 0; x < m.length; x++) < String i = t1.getText(); if (i.equals(m[x]) )< String q = "Результат поиска"+m[x];
l2.setText(q); >
> > >
>
>

Читайте также:  Java arraylist and map

Kokomok (@evedro) says:

Добрый день.Я только, только начал изучать java.Подскажите пожалуйста как связать между собой графический интерфейс и отдельно написанный код программ.Нужно, чтобы при нажатии на кнопки выводили нужные значения в строки,результат математического расчета.Прописать в коде графического интерфейса назначить кнопкам действия из другого кода.Можно наглядно примерами?

Александр Лукьянчук says:

Господа, у меня возникла проблема. При нажатии на клавишу клавиатуры должно высвечиваться сообщение, но после нажатия кнопки, сообщение от клавиатуры не работает. Не подскажете, в чём моя ошибка? Вот код: import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea; public class Calculator_Evolution < public static void main(String[] args) okno e = new okno(); > >
class okno extends JFrame public okno() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(new panel());
setBounds(10, 10, 800, 600);
setTitle(«Calculator: Evolution»);
setVisible(true);
>
>
class panel extends JPanel int a = 0;
public class Key implements KeyListener < @Override
public void keyPressed(KeyEvent e) a = e.getKeyCode();
System.out.println(a);
if (a >= 96 && a <= 111)JOptionPane.showMessageDialog(null, "Нажата кнопка на клавиатуре");
>
else a = 0;
>
> @Override
public void keyReleased(KeyEvent arg0) < >@Override
public void keyTyped(KeyEvent arg0) < >> public panel() < this.setLayout(null); String[] s = new String[]; for (int i = 0; i = 12) j = i — 12;
b.setLocation(550,150 + 50*j);
b.setSize(75, 30);
b.setText(s[j]);
>
else if (i >= 9) j = i — 9;
b.setLocation(235 + 105*j, 300);
b.setSize(75, 30);
if (i == 11) b.setText(s[6]);
>
else if (i == 10) b.setText(«» + 0);
>
else if (i == 9) b.setText(s[5]);
>
//b.setText(s[i-9]);
> else if (i >= 6) j = i — 6;
b.setLocation(235 + 105*j, 250);
b.setSize(75, 30); > else if (i >= 3) j = i — 3;
b.setLocation(235 + 105*j, 200);
b.setSize(75, 30);
> else if (i < 3)j = i;
b.setLocation(235 + 105*j, 150);
b.setSize(75, 30);
>
if (i < 9) b.setText("" + (i+1));
>
b.addActionListener(new ActionListener() < @Override
public void actionPerformed(ActionEvent arg0) JOptionPane.showMessageDialog(null, «Кнопка нажата»);
>
>);
this.add(b);
>
addKeyListener(new Key());
setFocusable(true);
JLabel d = new JLabel();
d.setLocation(70, 80);
d.setSize(200, 30);
d.setFont(new Font(«Comic Sans MS»,1,30));
d.setText(«Результат:»);
this.add(d); JTextArea text = new JTextArea();
text.setLocation(235, 80);
text.setSize(300, 30);
text.setBackground(new Color (196, 231, 255));
text.setFont(new Font(«Calibri Italic», 3, 30));
text.setText(«0»);
text.setEditable(true);
this.add(text);
>
>

Подскажите как сделать так чтоб после того как кнопка была нажата в JTexfField появлялся текст (именно не test.settext(«text»); а добавлялся после каждого нажатия) ?

А можно как то отследить нажатие клавиш через KeyListener и по нажатию ентера вызывать отправку сообщений, если да то как?

Источник

Оцените статью