如何将JSpinner的更新值从一个Java类传递到另一个Java类
我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

