如何创建可在点击后更新的JLabel?

时间:2019-04-10 03:07:53

标签: java swing user-interface jbutton

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

这是按钮的代码:

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 :(得分:0)

您有两个ActionListeners:

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

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

因此,您可以在计数器变量增加之前更新标签上的文本。

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

  1. 按钮
  2. 标签
  3. 柜台。

创建组件并将其添加到面板,然后将单个侦听器添加到按钮。

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

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