运行时如何更新JLabel内容?无需重复创建JLabel的简便实现方法
解决方法
核心逻辑非常简单,完全不需要每次更新都新建JLabel实例,只需要在数值更新后调用JLabel.setText()方法修改组件的显示内容即可,你之前更新不生效的根本原因是只修改了独立的health变量,没有同步修改JLabel本身的text属性,Swing组件不会自动和普通变量做内容绑定。
现有代码的核心问题
- 按钮点击事件里仅修改了
health字符串变量,没有调用heart实例的setText()方法同步内容 - 初始化时的
while(loop==1)逻辑完全不会执行,程序启动时loop默认值为0,这段代码没有任何作用 - 可选优化:不推荐使用
null绝对布局,优先用Swing自带的布局管理器适配不同屏幕
修改后的完整代码
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class officia { static JFrame Frame; static JPanel Panel; static JTextField healthPlace; static JButton begin; static JLabel heart; public static void main(String[] args) { Panel = new JPanel(); Frame = new JFrame(); Frame.setSize(500,1000); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Frame.add(Panel); Panel.setLayout(null); healthPlace = new JTextField(); healthPlace.setBounds(170, 130, 165, 25); Panel.add(healthPlace); begin = new JButton("Begin"); begin.setBounds(217, 185, 70, 25); Panel.add(begin); // 初始化JLabel只需要执行一次 heart = new JLabel("0"); heart.setBounds(150, -85, 500, 500); Panel.add(heart); Frame.setVisible(true); ActionListener beginPressed = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 直接修改JLabel的显示内容,无需修改额外变量,也不需要新建实例 heart.setText(healthPlace.getText()); } }; begin.addActionListener(beginPressed); } }
额外说明
如果需要展示的是整型数值,在调用setText前可以先做输入合法性校验,比如:
try { int healthNum = Integer.parseInt(healthPlace.getText()); heart.setText(String.valueOf(healthNum)); } catch (NumberFormatException ex) { heart.setText("输入不合法,请输入数字"); }
修改完text属性后不需要额外调用revalidate()和repaint(),setText()方法内部已经自动触发了重绘逻辑。
内容的提问来源于stack exchange,提问作者Levi Earle
相关产品推荐
相关产品推荐

