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

如何将JSpinner的更新值从一个Java类传递到另一个Java类

问题:如何让独立类获取JSpinner更新后的值

我Java基础薄弱,尤其对类的概念理解不足。我有一个settingsPanel类,里面有个public static JSpinner组件,用SpinnerNumberModel(2, 2, 4, 1)初始化。更新JSpinner的值(可选2、3、4)后,点击另一个独立类saveSettingsButton里的JButton,只能拿到默认值2,拿不到更新后的值。

我知道可能是static修饰符的问题,但去掉static后会报错:Non-static field 'JSpinner_name' cannot be referenced from a static context。

原settingsPanel类代码:

public class settingsPanel extends JPanel {
    public static JSpinner playersCount = new JSpinner(new SpinnerNumberModel(2, 2, 4, 1));
    
    public void main(){

        //some code with JSpinner change listener

        add(playersCount);
        saveSettingsButton saveSettingsButton = new saveSettingsButton();
        add(saveSettingsButton);
        saveSettingsButton.main();
    }
}

原saveSettingsButton类代码:

public class saveSettingsButton extends JButton {
    public void main(){

        //some code

        addActionListener(e -> {
            int errorChecking = 0;
            switch ((int) settingsPanel.playersCount.getValue()) {

                //some code

        });
    }
}

我想让saveSettingsButton类获取到settingsPanel.playersCount.getValue()的更新后的值,试过写方法但没成功,请问该怎么实现?


解决方案

核心问题是static导致组件实例不对应,同时跨类访问没有用正确的实例引用。按以下步骤修改:

1. 移除settingsPanel中JSpinner的static修饰符

把public static JSpinner playersCount改成public JSpinner playersCount,这样每个settingsPanel实例都有自己的JSpinner,值的更新会被正确保存。

修改后的settingsPanel类:

public class settingsPanel extends JPanel {
    // 去掉static修饰符
    public JSpinner playersCount = new JSpinner(new SpinnerNumberModel(2, 2, 4, 1));
    
    public void main(){
        // 保留你的JSpinner监听器代码
        add(playersCount);
        // 创建按钮时把当前settingsPanel实例传进去
        saveSettingsButton saveSettingsButton = new saveSettingsButton(this);
        add(saveSettingsButton);
        saveSettingsButton.main();
    }
}

2. 修改saveSettingsButton类,通过构造方法接收settingsPanel实例

在按钮类里保存一个settingsPanel的引用,这样就能访问到对应实例的JSpinner,而不是试图访问静态字段。

修改后的saveSettingsButton类:

public class saveSettingsButton extends JButton {
    // 保存settingsPanel的实例引用
    private settingsPanel panel;

    // 构造方法接收settingsPanel实例
    public saveSettingsButton(settingsPanel panel) {
        this.panel = panel;
    }

    public void main(){
        // 保留你的其他代码
        addActionListener(e -> {
            int errorChecking = 0;
            // 通过实例引用获取更新后的JSpinner值
            switch ((int) panel.playersCount.getValue()) {
                // 你的业务代码
            }
        });
    }
}

为什么这样改?

  • 去掉static后,每个settingsPanel实例的JSpinner都是独立的,更新的值会存在当前实例里,不会被其他实例覆盖。
  • 通过构造方法传递settingsPanel实例,让按钮类能直接访问到当前界面的JSpinner,而不是依赖静态字段,这样就能拿到最新的用户输入值。

内容的提问来源于stack exchange,提问作者BadCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:32:32