如何创建一个点击更新的 JLabel?

How to create a JLabel that updates on a click?

我正尝试在 Java 中学习 GUI 编程,目前我有一个包含按钮和标签的框架。单击该按钮时,会弹出一个对话框,说明该按钮被单击了多少次。我想对标签做基本相同的事情,但我无法让它更新过去,说它被点击了零次。

这是按钮的代码:

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() 更改标签的文本,但现在我的问题是第一次单击按钮不会更新它。点了两次才开始更新,然后点击次数比实际点击次数少一个。

您有两个 ActionListener:

  1. 在按钮的构造函数中添加了一个 class。
  2. 第二个添加到您的主要方法中。

Swing 以将侦听器添加到组件的相反顺序调用 ActonListeners。

因此您在计数器变量递增之前更新了标签上的文本。

更好的设计是创建一个 JPanel class。您创建面板的一个实例并将其添加到框架中。此 class 将包含:

  1. 按钮
  2. 标签
  3. 计数器。

您创建组件并将它们添加到面板,并向按钮添加一个侦听器。

通过这种设计,所有变量都定义在同一个 class 中。因此所有组件都可以相互协同工作。不要在 main() 方法中定义 Swing 组件。

例如,请参阅 How to Use Buttons 上 Swing 教程中的部分,以更好地设计您的代码,展示如何创建包含多个相关组件的面板。