Форум программистов, компьютерный форум, киберфорум
Java: GUI, Графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 17.08.2017
Сообщений: 118
1

Обработка событий

11.05.2018, 13:38. Показов 757. Ответов 4

Добрый день. В ходе знакомства с java я добрался до обработки событий. Подскажите, пожалуйста, как правильно писать класс-обработчик события: отдельным классом или вложенным? Мой первый опыт написания обработчика неудачен - в классе-обработчике я не могу обратиться к объектам из главного класса. Они попросту не видны. Подскажите, пожалуйста, что я неправильно делаю. Код прилагается.
Буду благодарен за любые прочие замечания по написанию приложений с графическим интерфейсом.
Java
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
public class Alphabet extends JFrame {
 
    public Alphabet(String s) {
        super(s);
        EventMaker em = new EventMaker();
 
        GridLayout manager = new GridLayout();
        manager.setRows(8);
        manager.setColumns(4);
 
        JPanel p1 = new JPanel();
        p1.setBackground(Color.LIGHT_GRAY);
        p1.setLayout(manager);
        add(p1);
 
        StringTokenizer rusAl = new StringTokenizer("А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Э Ю Я");
        while (rusAl.hasMoreTokens()){
            JButton button = new JButton(rusAl.nextToken());
            button.setBounds(10, 10, 30, 30);
            button.setBackground(Color.ORANGE);
            button.addActionListener(em);
            p1.add(button);
        }
        setSize(500, 500);
        setVisible(true);
    }
 
    public static void main(String[] args){
        JFrame f = new Alphabet("Знай азбуку");
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public class EventMaker implements ActionListener {
 
        @Override
        public void actionPerformed(ActionEvent e) {
            String str = e.getActionCommand();
            switch (str){
                case "А":
                    //Сменить, например, цвет кнопки на зелёный
                    setBackground(Color.BLUE);
                    break;
                case "Б":
                    setBackground(Color.RED);
                    break;
                case "В":
                    break;
                default:
 
            }
 
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2018, 13:38
Ответы с готовыми решениями:

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

Не работает обработка событий
В intellij IDEA с помощью UI master создал форму, добавил обработчик событий, но при нажатии на...

Обработка событий мыши
Всем доброго времени суток. У меня возник вопрос относительно обработки событий мыши. ...

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

__________________

Записывайтесь на профессиональные курсы Java-разработчиков
Обучение в Java Mentor с оплатой после трудоустройства
4
3039 / 2536 / 782
Регистрация: 05.07.2013
Сообщений: 12,275
11.05.2018, 13:49 2
Цитата Сообщение от Иван24 Посмотреть сообщение
как правильно писать класс-обработчик события: отдельным классом или вложенным?
без разницы
Цитата Сообщение от Иван24 Посмотреть сообщение
Подскажите, пожалуйста, что я неправильно делаю
лезешь вперед паровоза, читай внимательно https://docs.oracle.com/javase... a/TOC.html
0
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
11.05.2018, 14:05 3
Порция медвежатины
Кликните здесь для просмотра всего текста
Java
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
import javax.swing.*;
import java.awt.*;
import java.util.StringTokenizer;
 
public class Alphabet extends JFrame {
 
    public Alphabet(String s) {
        super(s);
 
        GridLayout manager = new GridLayout();
        manager.setRows(8);
        manager.setColumns(4);
 
        JPanel p1 = new JPanel();
        p1.setBackground(Color.LIGHT_GRAY);
        p1.setLayout(manager);
        add(p1);
 
        StringTokenizer rusAl = new StringTokenizer("А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Э Ю Я");
        while (rusAl.hasMoreTokens()) {
            JButton button = new JButton(rusAl.nextToken());
            button.setBounds(10, 10, 30, 30);
            button.setBackground(Color.ORANGE);
            /* e -> {} можно заменить на
               new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
 
                }
            }
            А что такое e -> можно узнать, почитав про лямбда-выражения в java) */
            button.addActionListener(e -> {
                String str = e.getActionCommand();
                switch (str) {
                    case "А":
                        //Сменить, например, цвет кнопки на зелёный
                        button.setBackground(Color.GREEN);
                        break;
                    case "Б":
                        button.setBackground(Color.RED);
                        break;
                }
            });
        }
        setSize(500, 500);
        setVisible(true);
    }
 
    public static void main(String[] args) {
        JFrame f = new Alphabet("Знай азбуку");
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}


Мб пригодится тоже
рандомные цвета для всех кнопок сразу
Java
1
2
3
4
5
6
7
import java.util.Random;//это в импорте разумеется)
  button.addActionListener(e ->
                        button.setBackground(new Color(
                                new Random().nextInt(255),
                                new Random().nextInt(255),
                                new Random().nextInt(255)))
                );
1
2 / 2 / 0
Регистрация: 17.08.2017
Сообщений: 118
11.05.2018, 19:10  [ТС] 4
Большое спасибо, GreeNicee. Про существование лямбда-выражений узнал от Вас. Подскажите, пожалуйста, в чём причина того, что в моём примере класс-обработчик не "видел" кнопок? Каким образом можно реализовать обработку события используя класс-обработчик? Лямбда-выражения безусловно хороши, но как известно не всегда применимы.
0
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
11.05.2018, 21:58 5
Цитата Сообщение от Иван24 Посмотреть сообщение
Подскажите, пожалуйста, в чём причина того, что в моём примере класс-обработчик не "видел" кнопок?
Потому что вы вызывали не метод кнопки, а метод фрейма. А вообще делать отдельный класс для обработки события мне кажется - это извращение), даже если у вас несколько элементов, которым нужно назначить одинаковую процедуру, достаточно это событие как показывалось выше назначить и всю логику вынести в отдельную процедуру, которая и будет вызываться. А, чтобы ваш пример работал я методом тыка (т.к. давно в swinge ничего не делал) сделал вот так. Но там выполняется нисходящее преобразование, и если ивент вызовет не JButton, то будет крит)
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class EventMaker implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String str = e.getActionCommand();
            JButton b = (JButton) e.getSource();
 
            switch (str){
                case "А":
                    //Сменить, например, цвет кнопки на зелёный
                    b.setBackground(Color.BLUE);
                    break;
                case "Б":
                    b.setBackground(Color.RED);
                    break;
                case "В":
                    break;
                default:
 
            }
 
        }
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2018, 21:58

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

Обработка событий клавиатуры
Доброе время суток. Столкнулся с проблемкой - никак не могу считать данные с клавиатуры. ЗЫ...

Обработка событий и метод paint()
Приветствую. Столкнулся с проблемой при обработке событий и использовании метода paint()...

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

Назначение клавиш и обработка событий
package Menu; import java.awt.Dimension; import java.awt.Font; import...

Обработка событий на графическом интерфейсе
Всем доброго времени суток.Начинаю потихоньку въезжать в ГПИ. Наткнулся на статью в которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.