如何创建一个点击更新的 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:
- 在按钮的构造函数中添加了一个 class。
- 第二个添加到您的主要方法中。
Swing 以将侦听器添加到组件的相反顺序调用 ActonListeners。
因此您在计数器变量递增之前更新了标签上的文本。
更好的设计是创建一个 JPanel class。您创建面板的一个实例并将其添加到框架中。此 class 将包含:
- 按钮
- 标签
- 计数器。
您创建组件并将它们添加到面板,并向按钮添加一个侦听器。
通过这种设计,所有变量都定义在同一个 class 中。因此所有组件都可以相互协同工作。不要在 main() 方法中定义 Swing 组件。
例如,请参阅 How to Use Buttons 上 Swing 教程中的部分,以更好地设计您的代码,展示如何创建包含多个相关组件的面板。
我正尝试在 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:
- 在按钮的构造函数中添加了一个 class。
- 第二个添加到您的主要方法中。
Swing 以将侦听器添加到组件的相反顺序调用 ActonListeners。
因此您在计数器变量递增之前更新了标签上的文本。
更好的设计是创建一个 JPanel class。您创建面板的一个实例并将其添加到框架中。此 class 将包含:
- 按钮
- 标签
- 计数器。
您创建组件并将它们添加到面板,并向按钮添加一个侦听器。
通过这种设计,所有变量都定义在同一个 class 中。因此所有组件都可以相互协同工作。不要在 main() 方法中定义 Swing 组件。
例如,请参阅 How to Use Buttons 上 Swing 教程中的部分,以更好地设计您的代码,展示如何创建包含多个相关组件的面板。