Назад Зміст Вперед

11.9 Використання JButton та JTextField.

Кожна програма, яка має графічний інтерфейс користувача не може обходитися без кнопок. У Java Swing кнопка представлена ​​класом JButton. У кнопки є різні методи для її конфігурації - установка написів на JButton, установка іконки, вирівнювання тексту, установка розмірів і так далі. Крім усього іншого розробнику необхідно "навісити" на JButton слухача, який буде виконуватися як тільки користувач натисне на кнопку. Як це зробити?
Всі взаємодії користувача з додатком засновані на події. Не є винятком і JButton. Як тільки користувач натискає кнопку, створюється ActionEvent подія, яке передається слухачам кнопки. Для того, щоб організувати слухача 
Swing надає інтерфейс ActionListener, який необхідно реалізувати. Інтерфейс ActionListener вимагає тільки реалізації одного методу - actionPerformed. Приклад класу, що реалізує інтерфейс ActionListener представлений нижче.
1
2
3
4
5
public class TestActionListener implements ActionListener {
     public void actionPerformed(ActionEvent e) {
          //Код, який необхідно виконати при натисненні на кнопку
     }
}
Після того, як обробник створений, його необхідно додати до кнопки. Робиться це за допомогою методу addActionListener. Як параметр методу передається обробник. Наприклад, це можна зробити ось так:
1
2
3
JButton button = new JButton("Test button");
ActionListener actionListener = new TestActionListener();
button.addActionListener(actionListener);
Тут створюємо спочатку кнопку. Потім створюємо екземпляр нашого слухача TestActionListener, а потім додаємо його в якості слухача до кнопки за допомогою виклику addActionListener і передаємо йому примірник обробника. Взагалі слухачів може бути невизначена кількість. Якщо буде необхідно два або більше слухачі, які повинні будуть по-різному реагувати на натискання кнопки, то для кожного з них викликають addActionListener. Крім того може коли-небудь знадобитися відключити слухача і сказати йому, щоб він більше не прослуховував натискання кнопки. Це можна зробити за допомогою методу removeActionListener. Сюди в якості параметра доведеться передати посилання на слухача, якого хочемо видалити зі списку слухачів кнопки JButton.
Ну і наостанок приклад програми для демонстрації обробників натискання кнопки JButton.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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);
               }
          });
     }
}

Варто сказати про кілька цікавих моментів. 
Перший - це використання команди дії. Можна помітити, що у кнопок викликається метод setActionCommand, в який для кожної кнопки передає своє значення рядка. Таким чином в додатку можна зрозуміти, яка саме кнопка була натиснута, якщо обробку натискання кількох кнопок виконує один слухач. Для того, щоб дізнатися про це у ActionEvent береться команда дії за допомогою методу getActionCommand.
Другий момент - для обробки події натискання кнопки JButton можна створити анонімний клас, який реалізує інтерфейс ActionListener. Це можна спостерігати ось тут:
1
2
3
4
5
button3.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          textField.setText(e.getActionCommand());
     }
});

У наступному прикладі показано, як створити компонент JButton

package com.javacodegeeks.snippets.desktop;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class CreateJButtonExample extends JFrame {

 private static final long serialVersionUID = 1L;

 public CreateJButtonExample() {

  // Макет потоку набір для фрейму
  this.getContentPane().setLayout(new FlowLayout());

  JButton button1 = new JButton();
  button1.setText("Java Code Geeks");

  JButton button2 = new JButton("Java Examples & Code Snippets");

  // додавання кнопок до фрейму
  add(button1);
  add(button2);

 }

 private static void createAndShowGUI() {

 // Створення та налагодження вікна

  JFrame frame = new CreateJButtonExample();

  // Відображення вікна

  frame.pack();

  frame.setVisible(true);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

 public static void main(String[] args) {

 // Графік роботи для потоку диспетчеризації подій:
 // Створення і показ GUI цього додатка
  javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

    createAndShowGUI(); 

}

  });
    }

}




Текстове поле JTextField

Текстове поле - простий і часто використовуваний компонент, призначений для введення невеликих за обсягом (записуються в один рядок) текстових даних. Для створення текстового поля найчастіше використовуються конструктори:

JTextField (int columns) - створює пусте текстове поле, ширина якого достатня для розміщення columns символів. При цьому користувач може вводити в текстове поле рядок будь-якої довжини: вона просто буде прокручуватися.

JTextField (String text) - створює текстове поле з початковим текстом text.

JTextField (String text, int columns) - встановлює і ширину і початковий текст.

Занести текст в поле можна методом setText (String text). Метод getText () повертає вміст текстового поля цілком, а getText (int offset, int length) - фрагмент вмісту довжини length, починаючи з символу offset.

Частина тексту в поле може виділятися (як програмним шляхом, так і в результаті дій користувача). Метод getSelectedText () дозволяє отримати виділену частину тексту. Замінити виділений текст іншим можна за допомогою методу replaceSelection (String content). Методи getSelectionStart () і getSelectionEnd () повертають межу виділеної ділянки, а методи setSelectionStart (int start) і setSelectionEnd (int end) змінюють їх.

Метод getCaretPosition () повертає позицію курсора (каретки) в текстовому полі, а метод setCaretPosition (int position) дозволяє задати її програмно. Методом setCaretColor (Color color) можна змінити колір курсора.

За замовчуванням текст в поле притискається до лівого краю. Змінити це можна методом setHorizontalAlignment (int align), як параметр передається одна з констант вирівнювання, визначених у цьому ж класі JTextField: LEFT, CENTER, RIGHT.
.