获取微调器的当前范围?
Get current range of a spinner?
我的问题很简单,很遗憾我找不到答案。
基本上,我有一个带有 2 JSpinner
的 Swing window。第二个 JSpinner
必须定义第一个 JSpinner
的上限。因此,例如,如果用户将值 4 放在第二个 JSpinner
上,则他们不能在第一个 JSpinner
上输入大于 4 的值。如果第一个 JSpinner
中当前显示的值高于 4,我将其设置为 4。
所以我在构造函数中用 SpinnerNumberModel
构建了我的两个 JSpinner
来设置初始边界:
// First spinner
SpinnerNumberModel spinnerLimits_sante = new SpinnerNumberModel(3, 0.25, 3, 0.25);
JSpinner spin_sante = new JSpinner(spinnerLimits_sante);
// Second spinner
JSpinner spin_sante_max = new JSpinner(spinnerLimits_sante_max);
SpinnerNumberModel spinnerLimits_sante_max = new SpinnerNumberModel(3, 3, 32767, 1);
为了得到第二个JSpinner
变化时的值,我想到了在上面用一个ChangeListener
。所以每次它改变时,我都可以获得新值,使用新边界重新创建一个 SpinnerNumberModel
对象(下限和间隔不会改变,但是上限会更新并且值会如果高于上限,则进行更新)。
ChangeListener listenerSanteMax = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
int newBound = spin_sante_max.getValue();
// ...
}
};
spin_sante_max.addChangeListener(listenerSanteMax);
不幸的是,这就是我卡住的地方:JSpinner
没有 getter 可以 return 一个 SpinnerNumberModel
对象,也没有它的值。
而且就算有,好像也没有setter。
所以,我的问题是:
是否可以动态更改微调器的范围和值?
提前致谢!
使用 getMode()
从 JSpinner
获取模型并将其类型转换为 SpinnerModelNumber
,如下所示:
SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel();
在 ChangeListener
中,不是创建新的 SpinnerNumberModel
,而是 更新 现有模型的最大值。这里有两种方法。
如果ChangeListener
可以看到微调器模型,您可以直接进行更新。
ChangeListener listenerSanteMax = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Number newMaximum = spinnerLimits_sante_max.getNumber().doubleValue();
spinnerLimits_sante.setMaximum((Comparable) newMaximum);
}
};
如果ChangeListener
无法看到微调器模型,您可以做一个cast。
JSpinner
有一个 getModel()
方法 returns 一个 SpinnerModel
。您可以将其转换为 SpinnerNumberModel
,但您应该使用 instanceof
来检查转换是否有效。
ChangeListener listenerSanteMax = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Object source = e.getSource();
if (source instanceof JSpinner) {
JSpinner spinner = (JSpinner) source;
SpinnerModel sm = spinner.getModel();
if (sm instanceof SpinnerNumberModel) {
SpinnerNumberModel model = (SpinnerNumberModel) sm;
Number newMaximum = model.getNumber().doubleValue();
spinnerLimits_sante.setMaximum((Comparable) newMaximum);
}
}
}
};
无论哪种情况,newMaximum
都是Number
,SpinnerNumberModel
支持的所有子类都是Comparable
。
我的问题很简单,很遗憾我找不到答案。
基本上,我有一个带有 2 JSpinner
的 Swing window。第二个 JSpinner
必须定义第一个 JSpinner
的上限。因此,例如,如果用户将值 4 放在第二个 JSpinner
上,则他们不能在第一个 JSpinner
上输入大于 4 的值。如果第一个 JSpinner
中当前显示的值高于 4,我将其设置为 4。
所以我在构造函数中用 SpinnerNumberModel
构建了我的两个 JSpinner
来设置初始边界:
// First spinner
SpinnerNumberModel spinnerLimits_sante = new SpinnerNumberModel(3, 0.25, 3, 0.25);
JSpinner spin_sante = new JSpinner(spinnerLimits_sante);
// Second spinner
JSpinner spin_sante_max = new JSpinner(spinnerLimits_sante_max);
SpinnerNumberModel spinnerLimits_sante_max = new SpinnerNumberModel(3, 3, 32767, 1);
为了得到第二个JSpinner
变化时的值,我想到了在上面用一个ChangeListener
。所以每次它改变时,我都可以获得新值,使用新边界重新创建一个 SpinnerNumberModel
对象(下限和间隔不会改变,但是上限会更新并且值会如果高于上限,则进行更新)。
ChangeListener listenerSanteMax = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
int newBound = spin_sante_max.getValue();
// ...
}
};
spin_sante_max.addChangeListener(listenerSanteMax);
不幸的是,这就是我卡住的地方:JSpinner
没有 getter 可以 return 一个 SpinnerNumberModel
对象,也没有它的值。
而且就算有,好像也没有setter。
所以,我的问题是: 是否可以动态更改微调器的范围和值?
提前致谢!
使用 getMode()
从 JSpinner
获取模型并将其类型转换为 SpinnerModelNumber
,如下所示:
SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel();
在 ChangeListener
中,不是创建新的 SpinnerNumberModel
,而是 更新 现有模型的最大值。这里有两种方法。
如果ChangeListener
可以看到微调器模型,您可以直接进行更新。
ChangeListener listenerSanteMax = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Number newMaximum = spinnerLimits_sante_max.getNumber().doubleValue();
spinnerLimits_sante.setMaximum((Comparable) newMaximum);
}
};
如果ChangeListener
无法看到微调器模型,您可以做一个cast。
JSpinner
有一个 getModel()
方法 returns 一个 SpinnerModel
。您可以将其转换为 SpinnerNumberModel
,但您应该使用 instanceof
来检查转换是否有效。
ChangeListener listenerSanteMax = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Object source = e.getSource();
if (source instanceof JSpinner) {
JSpinner spinner = (JSpinner) source;
SpinnerModel sm = spinner.getModel();
if (sm instanceof SpinnerNumberModel) {
SpinnerNumberModel model = (SpinnerNumberModel) sm;
Number newMaximum = model.getNumber().doubleValue();
spinnerLimits_sante.setMaximum((Comparable) newMaximum);
}
}
}
};
无论哪种情况,newMaximum
都是Number
,SpinnerNumberModel
支持的所有子类都是Comparable
。