我正在尝试学习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()更改标签的文本,但是现在我的问题是,第一个按钮单击了不会更新。单击两次后它才开始更新,然后单击数比实际单击数少一。
答案 0 :(得分:0)
您有两个ActionListeners:
Swing以将侦听器添加到组件的相反顺序调用ActonListeners。
因此,您可以在计数器变量增加之前更新标签上的文本。
更好的设计是创建一个JPanel类。您将创建面板的实例并将其添加到框架。此类将包含:
创建组件并将其添加到面板,然后将单个侦听器添加到按钮。
通过这种设计,所有变量都在同一类中定义。因此,所有组件都可以相互协作。不要在main()方法中定义Swing组件。
例如,请参见How to Use Buttons的Swing教程中的部分,以更好地设计代码,展示如何创建具有多个相关组件的面板。