为什么我的 JLabel 没有在每次点击时更新?
Why isn't my JLabel updating on each click?
基本上,我试图做到这一点,因此每次您单击 JFrame 中的某处时,JLabel 都会加 1。问题是,如果我要打印出 amount 的值,它会增加,但是实际的 JLabel 继续保持不变。
为了尝试解决这个问题,我尝试在您每次单击时更新 JLabel 对象,但这似乎也不起作用。 (写"JLabel();")除此之外,我真的想不出它可能是什么,
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Franels extends MouseAdapter {
int width, height;
int amount = 0;
JFrame frame = new JFrame("Title");
JPanel panel = new JPanel();
JButton button = new JButton("Hello");
JLabel label = new JLabel();
public void FrameConfig(int width, int height) {
this.width = width;
this.height = height;
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(null);
frame.setResizable(false);
frame.add(panel);
frame.getContentPane().addMouseListener(new Franels());
}
public void PanelConfig() {
panel.setBounds(300, 300, 300, 300);
panel.setBackground(Color.blue);
panel.setVisible(true);
panel.add(label);
}
public void LabelConfig() {
label.setForeground(Color.red);
label.setText(String.valueOf(amount));
}
public void mouseClicked(MouseEvent e) {
amount++;
LabelConfig();
System.out.println(amount);
}
}
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String args[]) {
Franels windows = new Franels();
windows.FrameConfig(900, 900);
windows.PanelConfig();
windows.LabelConfig();
}
}
更改金额后更新 JLabel 文本,它不会自动执行。
public void mouseClicked(MouseEvent e) {
amount++;
label.setText(String.valueOf(amount));
}
编辑:正如您所说,上述解决方案对您不起作用,我编写了一个小程序来模拟您正在尝试做的事情。
public class Panel extends JPanel implements MouseListener
{
JLabel label = new JLabel();
int amount = 0;
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(400,400);
frame.setContentPane(new Panel());
frame.setVisible(true);
}
public Panel()
{
addMouseListener(this);
label.setText(""+amount);
add(label);
}
public void mouseClicked(MouseEvent arg0)
{
amount++;
label.setText(""+amount);
System.out.println(amount);
}
}
所以,您的 "basic" 问题是,JPanel()
从未被调用,因此标签永远不会添加到 UI。
public class Franels extends MouseAdapter {
//...
JPanel panel = new JPanel();
// Just want to point out that these method names
// are poorly chosen
public void JFrame(int width, int height) {
//...
// Thi sis going to give you no end of issues
frame.setLayout(null);
//...
frame.add(panel);
//...
}
// This is never called
public void JPanel() {
panel.setBounds(300, 300, 300, 300);
panel.setBackground(Color.blue);
panel.setVisible(true);
panel.add(label);
}
//...
}
你的问题比较大
- 我会避免使用方法直接初始化组件。相反,他们应该创建自己的对象实例并 return 它。如果需要,您可以将它们分配给其他变量,但它们本身的方法应该是独立的
- 你的方法命名是......难以阅读。考虑改用
getXxx
(即 getPanel
、getLabel
)或更有意义的东西
null
布局完全是核心问题。您最好花时间学习如何使用布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container
已更新...
好的,经过更多的挖掘。已更新的 label
实例与屏幕上的 label
实例不同。这需要更多的挖掘,但问题归结为:
frame.getContentPane().addMouseListener(new Franels());
您正在创建 Franels
的新实例,它正在接收鼠标事件并更新其 label
实例,这与屏幕实例不同。
改为使用
frame.getContentPane().addMouseListener(this);
基本上,我试图做到这一点,因此每次您单击 JFrame 中的某处时,JLabel 都会加 1。问题是,如果我要打印出 amount 的值,它会增加,但是实际的 JLabel 继续保持不变。
为了尝试解决这个问题,我尝试在您每次单击时更新 JLabel 对象,但这似乎也不起作用。 (写"JLabel();")除此之外,我真的想不出它可能是什么,
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Franels extends MouseAdapter {
int width, height;
int amount = 0;
JFrame frame = new JFrame("Title");
JPanel panel = new JPanel();
JButton button = new JButton("Hello");
JLabel label = new JLabel();
public void FrameConfig(int width, int height) {
this.width = width;
this.height = height;
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(null);
frame.setResizable(false);
frame.add(panel);
frame.getContentPane().addMouseListener(new Franels());
}
public void PanelConfig() {
panel.setBounds(300, 300, 300, 300);
panel.setBackground(Color.blue);
panel.setVisible(true);
panel.add(label);
}
public void LabelConfig() {
label.setForeground(Color.red);
label.setText(String.valueOf(amount));
}
public void mouseClicked(MouseEvent e) {
amount++;
LabelConfig();
System.out.println(amount);
}
}
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String args[]) {
Franels windows = new Franels();
windows.FrameConfig(900, 900);
windows.PanelConfig();
windows.LabelConfig();
}
}
更改金额后更新 JLabel 文本,它不会自动执行。
public void mouseClicked(MouseEvent e) {
amount++;
label.setText(String.valueOf(amount));
}
编辑:正如您所说,上述解决方案对您不起作用,我编写了一个小程序来模拟您正在尝试做的事情。
public class Panel extends JPanel implements MouseListener
{
JLabel label = new JLabel();
int amount = 0;
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(400,400);
frame.setContentPane(new Panel());
frame.setVisible(true);
}
public Panel()
{
addMouseListener(this);
label.setText(""+amount);
add(label);
}
public void mouseClicked(MouseEvent arg0)
{
amount++;
label.setText(""+amount);
System.out.println(amount);
}
}
所以,您的 "basic" 问题是,JPanel()
从未被调用,因此标签永远不会添加到 UI。
public class Franels extends MouseAdapter {
//...
JPanel panel = new JPanel();
// Just want to point out that these method names
// are poorly chosen
public void JFrame(int width, int height) {
//...
// Thi sis going to give you no end of issues
frame.setLayout(null);
//...
frame.add(panel);
//...
}
// This is never called
public void JPanel() {
panel.setBounds(300, 300, 300, 300);
panel.setBackground(Color.blue);
panel.setVisible(true);
panel.add(label);
}
//...
}
你的问题比较大
- 我会避免使用方法直接初始化组件。相反,他们应该创建自己的对象实例并 return 它。如果需要,您可以将它们分配给其他变量,但它们本身的方法应该是独立的
- 你的方法命名是......难以阅读。考虑改用
getXxx
(即getPanel
、getLabel
)或更有意义的东西 null
布局完全是核心问题。您最好花时间学习如何使用布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container
已更新...
好的,经过更多的挖掘。已更新的 label
实例与屏幕上的 label
实例不同。这需要更多的挖掘,但问题归结为:
frame.getContentPane().addMouseListener(new Franels());
您正在创建 Franels
的新实例,它正在接收鼠标事件并更新其 label
实例,这与屏幕实例不同。
改为使用
frame.getContentPane().addMouseListener(this);