[英]Get current range of a spinner?
我的问题很简单,遗憾的是我无法找到答案。 基本上,我有一个Swing窗口,有2个JSpinner
。 第二个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
没有可以返回SpinnerNumberModel
对象及其值的getter。 即使有一个,似乎也没有制定者。
所以,我的问题是 : 是否有可能动态地改变微调器的范围和值?
提前致谢!
在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
无法看到微调器模型,则可以进行强制转换 。 JSpinner
有一个getModel()
方法返回一个SpinnerModel
。 您可以将其SpinnerNumberModel
转换为SpinnerNumberModel
,但您应该使用instanceof
来检查SpinnerNumberModel
转换是否有效。
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
。
使用getMode()
从JSpinner
获取模型并将其类型转换为SpinnerModelNumber
如下所示:
SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.