Как создать JLabel, который обновляется по клику? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь освоить программирование на 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 (), но теперь моя проблема заключается в том, что нажатие первой кнопки не обновляет его. Обновление начинается только после двойного нажатия, а затем число кликов отстает от фактического количества кликов.

1 Ответ

0 голосов
/ 10 апреля 2019

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

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

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

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

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

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

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

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

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

...