繁体   English   中英

获取旋转器的当前范围?

[英]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都是一个NumberSpinnerNumberModel支持的所有子类都是Comparable

使用getMode()JSpinner获取模型并将其类型转换为SpinnerModelNumber如下所示:

SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM