获取微调器的当前范围?

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无法看到微调器模型,您可以做一个castJSpinner 有一个 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都是NumberSpinnerNumberModel支持的所有子类都是Comparable