Как создать JLabel, который обновляется по щелчку?

Я пытаюсь изучить программирование GUI на Java, и в настоящее время у меня есть фрейм, содержащий кнопку и метку. При нажатии кнопки появляется диалоговое окно, в котором указывается, сколько раз была нажата кнопка. Я хочу сделать то же самое для метки, но я не могу заставить ее обновляться, говоря, что она была нажата ноль раз.

Вот код кнопки:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CountButton extends JButton {
    private int counter = 0;

    public CountButton(String text) {
        super(text);
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                counter++;
                JOptionPane.showMessageDialog(null, "You have clicked the button "
                        + counter + " times!");
            }
        });
    }

    public int getCounter() {
        return counter;
    }
}

Вот моя попытка реализации:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LayoutPractice {
    public static void main(String[] args) {
        JFrame frame = new JFrame("GUI Layout Practice");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1020,700);
        JPanel panelOne = new JPanel();

        //Button portion of frame
        JButton button = new CountButton("Click me for a dialog!");
        panelOne.add(button);

        JLabel label = new JLabel("The button has been pressed 0 times.");
        panelOne.add(label);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("The button has been pressed " + 
                    ((CountButton) button).getCounter() + " times.");
            }
        });

        frame.add(panelOne, BorderLayout.NORTH);
        frame.setVisible(true);
    }
}

Редактировать: я изменил код, чтобы добавить событие прослушивателя к кнопке, чтобы при ее нажатии он изменял текст метки с помощью label.setText(), но теперь моя проблема в том, что первое нажатие кнопки не обновить его. Он начинает обновляться только после двойного щелчка по нему, и тогда количество кликов на один меньше фактического количества кликов.

«У меня есть подозрение, что это связано с тем, что после создания ярлыка его нельзя обновить». Конечно можно обновить. Он просто не обновляется в соответствии с изменением переменной, используемой для его инициализации.
Andrew Thompson 10.04.2019 05:16

@AndrewThompson Итак, как я могу обновить его после инициализации?

Produces 10.04.2019 05:21

Я дам вам знать, когда увижу SSCCE/MCVE.

Andrew Thompson 10.04.2019 05:59

@AndrewThompson Хорошо, я думаю, что это редактирование должно удовлетворять требованиям SSCCE.

Produces 10.04.2019 06:09
«Я думаю, что редактирование должно удовлетворять требованиям SSCCE» Попробуй! Запустите новый проект в своей среде IDE, скопируйте/вставьте код и убедитесь, что он работает. без каких-либо изменений. Если нет, это не MCVE/SSCCE проблемы во время выполнения, поскольку он не является ни завершенным, ни автономным. Я только что опубликовал MCVE/SSCCE на другой поток. Обратите внимание, что у него есть импорт, структура классов... все, что нужно для его запуска.
Andrew Thompson 10.04.2019 06:21

@AndrewThompson Хорошо, давай попробуем еще раз...

Produces 10.04.2019 06:27

См.: stackoverflow.com/help/someone-answers

c0der 10.04.2019 10:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть два ActionListeners:

  1. один добавлен в конструктор вашего класса кнопки.
  2. второй добавлен в ваш основной метод.

Swing вызывает ActonListeners в обратном порядке, в котором прослушиватель добавляется к компоненту.

Таким образом, вы обновляете текст на этикетке до того, как переменная счетчика будет увеличена.

Лучше создать класс JPanel. Вы создаете экземпляр панели и добавляете его в фрейм. Этот класс будет содержать:

  1. кнопка
  2. этикетка
  3. счетчик.

Вы создаете компоненты и добавляете их на панель, а также добавляете один слушатель к кнопке.

В этом дизайне все переменные определены в одном классе. Таким образом, все компоненты могут работать вместе друг с другом. Не определяйте компоненты Swing в методе main().

Например, см. раздел учебного пособия по Swing на Как использовать кнопки для лучшего дизайна вашего кода, показывающего, как создать панель с несколькими связанными компонентами.

Отлично, это было именно то, что мне нужно, и это сделало программу намного менее уродливой. Спасибо!

Produces 10.04.2019 07:25

Другие вопросы по теме