Java Swing公共类成员变量无法跨窗体获取更新后的值问题求助
问题分析与解决方案
哦,我明白你遇到的问题了——你在jrame2里新建了一个全新的GUI实例,而不是引用用户实际操作过的那个已经输入了数值的GUI窗口对象,所以拿到的自然是变量的初始值0啦。
为什么会这样?
当你执行GUI Class = new GUI();时,Java会创建一个完全独立的GUI对象,这个对象里的Num1、Num2、Num3都是默认的初始值0,和你之前那个用户输入过文本框的GUI窗口没有任何关联。
解决方案1:传递已有的GUI实例(推荐,符合面向对象封装)
这是最规范的做法,把用户操作过的GUI对象直接传给jrame2,而不是新建一个。
步骤1:修改jrame2的构造方法,接收GUI实例
public jrame2(GUI existingGUI) { initComponents(); // 使用传入的、已经被用户操作过的GUI实例获取数值 lblValue.setText(String.valueOf(existingGUI.getNum1())); }
步骤2:给GUI类添加getter方法(封装变量,避免直接访问成员)
把Num1等变量改成private,并提供公共的getter方法,这是面向对象的最佳实践:
public class GUI extends javax.swing.JFrame { // 改为private,封装成员变量 private int Num1; private int Num2; private int Num3; // 提供getter方法供外部获取值 public int getNum1() { return Num1; } public int getNum2() { return Num2; } public int getNum3() { return Num3; } private void saveNumMouseClicked(java.awt.event.MouseEvent evt) { Num1 = Integer.parseInt(Field1.getText()); Num2 = Integer.parseInt(Field2.getText()); Num3 = Integer.parseInt(Field3.getText()); } }
步骤3:在GUI中打开jrame2时,传入当前实例
比如在GUI里的某个按钮点击事件中打开jrame2:
private void openJrame2BtnMouseClicked(java.awt.event.MouseEvent evt) { // 把当前GUI实例(this)传给jrame2的构造方法 jrame2 newFrame = new jrame2(this); newFrame.setVisible(true); }
解决方案2:使用静态变量(简单但不推荐)
如果你只是做简单的测试,不想改太多代码,可以把Num1等变量改成静态的。但要注意:静态变量是类级别的,所有GUI实例共享,如果你打开多个GUI窗口,数值会互相覆盖,不符合面向对象设计。
public class GUI extends javax.swing.JFrame { // 改为static变量 public static int Num1; public static int Num2; public static int Num3; private void saveNumMouseClicked(java.awt.event.MouseEvent evt) { Num1 = Integer.parseInt(Field1.getText()); Num2 = Integer.parseInt(Field2.getText()); Num3 = Integer.parseInt(Field3.getText()); } }
然后在jrame2中直接通过类名访问:
public jrame2() { initComponents(); lblValue.setText(String.valueOf(GUI.Num1)); }
总结
优先选择解决方案1,它更符合Java的面向对象封装原则,代码也更健壮、可维护。
内容的提问来源于stack exchange,提问作者Brandontom
相关产品推荐
相关产品推荐

