获取微调器的当前范围?
我的问题很简单,不幸的是我找不到答案。 基本上,我有一个Swing窗口,有2个JSpinner
s。第二个JSpinner
必须定义第一个JSpinner
的上限。例如,如果用户在第二个JSpinner
上放置值4,则它们不能在第一个JSpinner
中放置高于4的值。如果当前显示在第一JSpinner
值高于4我将它设置为4获取微调器的当前范围?
所以我已经建立了我的两个JSpinner
s的SpinnerNumberModel
在构造函数中设置初始范围:
// 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
。所以每当它发生变化时,我都可以获得新值,使用新边界重新创建一个对象(低边界和间隔不会改变,但是高边界将被更新,并且如果它的值将被更新高于上限)。
ChangeListener listenerSanteMax = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
int newBound = spin_sante_max.getValue();
// ...
}
};
spin_sante_max.addChangeListener(listenerSanteMax);
遗憾的是这就是我坚持:JSpinner
没有消气,将返回一个SpinnerNumberModel
对象,也没有自己的价值观。 即使有一个,似乎也没有setter。
所以,我的问题: 是否有可能动态更改微调器的范围和值?
在此先感谢!
在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()
方法返回a 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
。
我甚至没有意识到您可以在使用'SpinnerNumberModel'之后“放”到微调器中,我的听众可以看到微调器,所以我已经使用了第一种解决方案,并且添加了一个小的验证来更新第一个微调器的值(通过它的'SpinnerNumberModel'),如果它高于值第二个微调,非常感谢! –
使用getMode()
获得来自JSpinner
和模型其类型强制转换为SpinnerModelNumber
这样的:
SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel();
从Spinner获取模型(测试它是否是'instanceof' SpinnerNumberModel')并使用它。 *“所以,我的问题:是否有可能动态地改变微调器的范围和价值?“* - 我还没有尝试过,但是一旦拥有了'SpinnerNumberModel',就可以改变它的属性 – MadProgrammer
您是否熟悉类型转换? –