You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:25