Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16

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

19.01.2018, 20:10. Показов 963. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Интересная задача, очень хотелось бы разобраться в чем проблема. Помогите, пожалуйста

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

Код класса визуализации:
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
55
56
57
58
59
60
61
62
63
package Bikes;
 
import javax.swing.*;
import java.awt.FlowLayout;
 
public class BikesApp {
    
    JPanel windowContent = new JPanel();
    JFrame frame = new JFrame("Магазин велосипедов");
    
    JButton menuButton = new JButton("Выбрать модель");
    JPopupMenu menu = new JPopupMenu();
    
    JLabel LQuantity = new JLabel("Количество: ");
    JTextField quantity = new JTextField(10);
    
    JTextField mesResult = new JTextField(35);
    
    JButton toOrder = new JButton("Заказать");
    
                   
    BikesApp () {
                               
        FlowLayout fl = new FlowLayout();
        windowContent.setLayout(fl);
        
        JMenuItem model1 = new JMenuItem ("Модель 1");
        JMenuItem model2 = new JMenuItem ("Модель 2");
        JMenuItem model3 = new JMenuItem ("Модель 3");
        model1.setActionCommand("Модель1");
        model2.setActionCommand("Модель2");
        model3.setActionCommand("Модель3");
        menu.add(model1);
        menu.addSeparator();
        menu.add(model2);
        menu.addSeparator();
        menu.add(model3);
        
        windowContent.add(menuButton);
        windowContent.add(LQuantity);
        windowContent.add(quantity);
        windowContent.add(mesResult);
        windowContent.add(toOrder);
                                                 
        frame.setContentPane(windowContent);
        
        frame.setSize(440, 130);
        
        frame.setVisible(true);
        
        BikesEngine BikesEng = new BikesEngine(this);
        
        menuButton.addActionListener(BikesEng);
        toOrder.addActionListener(BikesEng);
        model1.addActionListener(BikesEng);
        model2.addActionListener(BikesEng);
        model3.addActionListener(BikesEng);
    }   
    
    public static void main (String[]args) {
        BikesApp bikeOrder = new BikesApp();
    } 
}
Код класса-обработчика:
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
55
56
57
58
59
60
61
package Bikes;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
class TooManyBakes extends Exception {
    TooManyBakes (String m) {
        super ("Мы не можем доставить столько велосипедов за один раз");
    }
}
 
public class BikesEngine implements ActionListener {
    
    BikesApp parent; // получаем объект из обработчика
    
     BikesEngine (BikesApp parent) { // конструктор сохраняет ссылку на экземлпяр текущего класса
        this.parent = parent;
    }
     
    public static void checkOrder (String dispModel, int dispQuantity) 
        throws TooManyBakes {
        if (dispQuantity > 3) {
        throw new TooManyBakes("Невозможно доставить " + dispQuantity + " велосипедов модели " + dispModel
        + " за одну доставку");}
    }
 
    String dispModel = "";
    int dispQuantity = 0;
             
    @Override
    public void actionPerformed(ActionEvent e) {
                     
        String dispFieldQuant = parent.quantity.getText();
         if (!"".equals(dispFieldQuant)) { 
                  dispQuantity = Integer.parseInt(dispFieldQuant);
                }
        
        Object src = e.getSource();
        
        int x = parent.menuButton.getX(); 
        int y = parent.menuButton.getY() + parent.menuButton.getHeight();
                
        if (src == parent.menuButton){
            parent.menu.show(parent.windowContent, x, y);
        if (e.getActionCommand() == "Модель1") {
            dispModel = "Модель 1";
         } else if (e.getActionCommand() == "Модель2") {
            dispModel = "Модель 2";
        } else if (e.getActionCommand() == "Модель3") {
            dispModel = "Модель 3";}}
       
        if (src == parent.toOrder) {
            parent.quantity.setText("");}
        try {
            BikesEngine.checkOrder(dispModel, dispQuantity);
            parent.mesResult.setText("Успешно!");
        } catch(TooManyBakes e1){
            parent.mesResult.setText(e1.getMessage());
        }
    }   
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2018, 20:10
Ответы с готовыми решениями:

Обработчик событий кнопки Login и проверка пользователя в БД
Добрый день! помогите пожалуйста понять что надо вставить в : public void actionPerformed(ActionEvent e) { } чтобы...

Обработка событий. Механизм делегирования событий
Разработать учебную программу. Основная ее задача – разработка упрощенной имитации поведения объектов (все последующие лабораторные работы...

Обработчик событий
Ребята, помогите, как это должно выглядеть? Замените стандартный обработчик исключительных ситуаций объекта Application собственной...

8
15 / 15 / 1
Регистрация: 15.01.2018
Сообщений: 42
19.01.2018, 21:11
Не знаю.

Добавлено через 3 минуты
Можете пожалуйста прикрепить лог консоли(вывод), чтобы посмотреть, что Вам выдало.
0
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 26
19.01.2018, 22:12
r_r, У меня ваш откомпилировался и код запустился.
Модель выбирается.
когда я нажимаю "Заказать"
Выводится: "Мы не можем доставить столько велосипедов за один раз".
Я ввел много велосипедов.

То есть обрабатывается :
Java
1
2
3
4
class TooManyBakes extends Exception {
    TooManyBakes (String m) {
        super ("Мы не можем доставить столько велосипедов за один раз");
    }
Вроде всё верно.

Добавлено через 2 минуты
Тут недостаток в программе в том, что это сообщение будет висеть постоянно
в поле вывода.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
19.01.2018, 23:21
Цитата Сообщение от r_r Посмотреть сообщение
Код класса визуализации
Вот раскажи, на кой чёрт ты на все кнопки повесил один и тот же обработчик?

Цитата Сообщение от r_r Посмотреть сообщение
Java
1
e.getActionCommand() == "Модель1"
https://en.wikibooks.org/wiki/... ng_Objects
0
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16
20.01.2018, 09:29  [ТС]
с отладчиком пока пытаюсь подружиться. Состояние переменных на одном и том же breakpoint через раз выводится (при этом после перезагрузки IDE выводится с первого раза). Работаю в NetBeans. Конкретно в этом примере где ни поставлю breakpoint - в консоли пусто, состояние переменных не отображается, меню в приложении не выпадает. Исключение - если поставить breakpoint после строки "if (src == parent.toOrder)", когда нажата кнопка заказа, но в консоли ничего интересного:

Прослушивание порта javadebug
Программа пользователя выполняется
LineBreakpoint BikesEngine.java : 53 успешно установлена.
Достигнута точка останова в строке 53 класса Bikes.BikesEngine потоком AWT-EventQueue-0.
Поток AWT-EventQueue-0 остановился на BikesEngine.java:53.

Добавлено через 13 минут
Не по плану было, что сообщение "Успешно!" выдавалось после нажатия кнопки "Выбрать модель!", а не после кнопки "Заказать" при выполнении условия по количеству велосипедов.

как выяснилось, иногда все гораздо проще, чем кажется - проблема была в фигурных скобках. После строки if (src == parent.toOrder) нужно было весь блок кода охватить фигурными скобками. Тогда все нормально работает.

Java
1
2
3
4
5
6
7
8
9
if (src == parent.toOrder) {
            parent.quantity.setText("");
        try {
            BikesEngine.checkOrder(dispModel, dispQuantity);
            parent.mesResult.setText("Успешно!");
            } catch(TooManyBakes e1){
            parent.mesResult.setText(e1.getMessage());
            }
        }
Добавлено через 28 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Сообщение от r_r
JavaВыделить код
1
e.getActionCommand() == "Модель1"
https://en.wikibooks.org/wiki/... ng_Objects
подскажите, пожалуйста, где тут ошибка?

Java
1
if (e.getActionCommand() == "Модель1")
это проверка условия на равенство, а не присвоение значения..
присвоение значения идет строкой ниже, там уже стоит оператор "="

Добавлено через 32 минуты
кстати, если кому интересно, организация меню возможна с объектом JComboBox, слушателем ItemListener. Принципиальных отличий пока не нахожу, такой способ выглядит более простым
0
15 / 15 / 1
Регистрация: 15.01.2018
Сообщений: 42
20.01.2018, 10:26
подскажите, пожалуйста, где тут ошибка?
Это не ошибка, просто если использовать материал статьи, то код легче и оптимизированнее будет.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
20.01.2018, 13:32
Цитата Сообщение от thematdev Посмотреть сообщение
Это не ошибка
Это именно ошибка.

Цитата Сообщение от r_r Посмотреть сообщение
подскажите, пожалуйста, где тут ошибка?
Статью прочитай.

Цитата Сообщение от r_r Посмотреть сообщение
то проверка условия на равенство
Равенство чего?
0
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16
20.01.2018, 13:36  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Равенство чего?
равенство полученного из объекта идентификатора (предварительно установленного в классе визуализации) значению "Модель1", чтобы понять, какой именно пункт меню был выбран
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
20.01.2018, 18:35
Цитата Сообщение от r_r Посмотреть сообщение
равенство полученного из объекта идентификатора (предварительно установленного в классе визуализации) значению "Модель1", чтобы понять, какой именно пункт меню был выбран
А ты смелый.

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.stream.IntStream;
 
final class BikesApp {
 
    private static final String SELECT_MODEL = "Select model";
 
    private final JFrame frame = new JFrame("Bike shop");
    private final JPanel windowContent = new JPanel();
 
    private final JButton modelSelectionButton = new JButton(SELECT_MODEL);
    private final JPopupMenu modelSelectionMenu = new JPopupMenu();
 
    private final JLabel quantityLabel = new JLabel("Quantity: ");
    private final JTextField quantityField = new JTextField(10);
 
    private final JTextField resultField = new JTextField(35);
    private final Color defaultResultFieldForeground = resultField.getForeground();
 
    private final JButton orderButton = new JButton("Order");
 
    private BikesApp() {
        final FlowLayout fl = new FlowLayout();
        windowContent.setLayout(fl);
 
        IntStream.rangeClosed(1, 3).forEach(i -> {
            final JMenuItem modelMenuItem = new JMenuItem("Model " + i);
            modelMenuItem.setActionCommand("Model" + i);
            if (i > 1) {
                modelSelectionMenu.addSeparator();
            }
            modelSelectionMenu.add(modelMenuItem);
            modelMenuItem.addActionListener(this::modelSelected);
        });
        modelSelectionButton.addActionListener(this::showModelSelectionMenu);
 
        windowContent.add(modelSelectionButton);
        windowContent.add(quantityLabel);
        windowContent.add(quantityField);
        windowContent.add(resultField);
        windowContent.add(orderButton);
 
        frame.setContentPane(windowContent);
        frame.setSize(440, 130);
        frame.setMinimumSize(frame.getSize());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
 
    private void showModelSelectionMenu(ActionEvent event) {
        final int x = modelSelectionButton.getX();
        final int y = modelSelectionButton.getY() + modelSelectionButton.getHeight();
        modelSelectionMenu.show(windowContent, x, y);
    }
 
    private void modelSelected(ActionEvent event) {
        resultField.setForeground(defaultResultFieldForeground);
        resultField.setText("");
        final String model;
        final String command = event.getActionCommand();
        if (command == "Model1") {
            model = "Model 1";
        } else if (command == "Model2") {
            model = "Model 2";
        } else if (command == "Model3") {
            model = "Model 3";
        } else {
            resultField.setForeground(Color.RED);
            resultField.setText("???? Unknown model: " + command);
            System.err.println("???? Unknown model: " + command);
            model = SELECT_MODEL;
        }
        modelSelectionButton.setText(model);
    }
 
    static BikesApp show() {
        final BikesApp app = new BikesApp();
        app.frame.pack();
        app.frame.setVisible(true);
        return app;
    }
 
    public static void main(String[]args) {
        BikesApp.show();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2018, 18:35
Помогаю со студенческими работами здесь

Обработчик событий
Есть 4 кнопки с названиями времен года, как описать обработчик событий, что бы при нажатии, на фреме менялась надпись, а над ней картинка,...

Обработчик событий
Доброе время суток... В общем я студент... и уже конец семестра... и надо срочно ваша помощь.... Нужна программа "Обработчик...

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

Обработчик событий
Как создать событие на вставку флешки(или другого устройства)в usb?

Обработчик событий
Здравствуйте! У меня имеется форма с тремя полями: Фрукты, Овощи и Итого. Необходимо, чтобы при изменении значений полей Фрукты и...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru