【问题标题】:How to create a JLabel that updates on a click?如何创建一个点击更新的 JLabel?
【发布时间】:2019-08-31 10:01:25
【问题描述】:

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

【问题讨论】:

  • “我怀疑这是因为标签一旦创建就无法更新。” 当然可以更新。它只是不会根据用于初始化它的变量的变化而更新。
  • @AndrewThompson 那么在初始化之后我该如何更新它呢?
  • 我会在看到 SSCCE / MCVE 后通知您。
  • @AndrewThompson 好的,我认为编辑应该满足 SSCCE 的要求。
  • “我认为编辑应该满足SSCCE”测试它!在您的 IDE 中启动一个新项目,复制/粘贴代码并检查它是否运行没有任何更改。如果没有,它不是运行的 MCVE / SSCCE时间问题,因为它既不是完整的也不是自包含的。我刚刚在another thread 上发布了一个 MCVE / SSCCE。注意它是如何导入的,一个类结构.. 运行它所需的一切。

标签: java swing user-interface jbutton


【解决方案1】:

你有两个 ActionListener:

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

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

所以你在计数器变量增加之前更新标签上的文本。

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

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

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

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

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

【讨论】:

  • 完美,这正是我所需要的,它使程序不那么难看。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2022-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多