java - 为什么我的 JLabel 没有在每次点击时更新?
问题描述
基本上,我试图做到这一点,所以每次单击 JFrame 中的某个位置时,JLabel 都会加 1。问题是,如果我要打印出数量的值,它会增加,但实际的 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();
}
}
解决方案
所以,你的“基本”问题是,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);
}
//...
}
你的大问题很多。
- 我会避免使用方法直接初始化组件。相反,他们应该创建自己的对象实例并返回它。如果需要,您可以将它们分配给其他变量,但它们本身的方法应该是自包含的
- 你的方法命名是......难以阅读。考虑使用
getXxx
代替(即,,getPanel
)getLabel
或更有意义的东西 null
布局只是核心中的一个完整的痛苦。您最好花时间学习如何使用布局管理器 API。有关更多详细信息,请参阅在容器中布置组件
更新...
好吧,经过更多的挖掘。label
被更新的实例与label
屏幕上的实例不同。这需要更多的挖掘,但问题归结为:
frame.getContentPane().addMouseListener(new Franels());
您正在创建 的新实例Franels
,它正在接收鼠标事件并更新其实例label
,这与屏幕的实例不同。
相反,使用
frame.getContentPane().addMouseListener(this);
推荐阅读
- node.js - Heroku 上的 React 应用程序获取无效的主机标头
- python - 如何在 QGIS 的右上角设置 DockWidget?
- c# - 使用 Lambda C# 使用另一个列表更新对象列表中的属性
- c++builder - std::variant:为什么没有可行的重载 '=' 错误
- python - 如何使用 python 发送 REST API(Google Vision 的 API)请求?
- sql-server - SQL 关键字“AS”的用途是什么?
- java - 私有静态函数不能使用参数,因为在while循环中使用了参数,所以如何解决这个问题?
- mongodb - 如何从所有 MongoDB 记录中仅获取几个字段
- python - django安全模板过滤器定制
- matlab - 如何在matlab中绘制一条垂直线?