Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
6 / 6 / 0
Регистрация: 17.08.2017
Сообщений: 141

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

11.05.2018, 13:38. Показов 1478. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2018, 13:38
Ответы с готовыми решениями:

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

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

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

4
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
11.05.2018, 13:49
Цитата Сообщение от Иван24 Посмотреть сообщение
как правильно писать класс-обработчик события: отдельным классом или вложенным?
без разницы
Цитата Сообщение от Иван24 Посмотреть сообщение
Подскажите, пожалуйста, что я неправильно делаю
лезешь вперед паровоза, читай внимательно https://docs.oracle.com/javase... a/TOC.html
0
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
11.05.2018, 14:05
Порция медвежатины
Кликните здесь для просмотра всего текста
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
6 / 6 / 0
Регистрация: 17.08.2017
Сообщений: 141
11.05.2018, 19:10  [ТС]
Большое спасибо, GreeNicee. Про существование лямбда-выражений узнал от Вас. Подскажите, пожалуйста, в чём причина того, что в моём примере класс-обработчик не "видел" кнопок? Каким образом можно реализовать обработку события используя класс-обработчик? Лямбда-выражения безусловно хороши, но как известно не всегда применимы.
0
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
11.05.2018, 21:58
Цитата Сообщение от Иван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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2018, 21:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru