获取旋转器的当前范围?

时间:2017-05-26 00:33:36

标签: java swing jspinner

我的问题很简单,遗憾的是我无法找到答案。 基本上,我有一个Swing窗口,有2 JSpinner s。第二个JSpinner必须定义第一个JSpinner的上限。因此,例如,如果用户将值4放在第二个JSpinner上,则他们必须无法在第一个JSpinner中放置高于4的值。如果当前显示在第一个JSpinner中的值高于4,我会将其设置为4.

所以我在构造函数中用JSpinner构建了两个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。因此,每次更改时,我都可以获取新值,使用新边界重新创建SpinnerNumberModel对象(下限和间隔不会更改,但是上限将更新,值将会如果它高于上限,则更新。

ChangeListener listenerSanteMax = new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        int newBound = spin_sante_max.getValue();
        // ...
    }
};
spin_sante_max.addChangeListener(listenerSanteMax);

不幸的是,这就是我被困住的地方:JSpinner没有可以返回SpinnerNumberModel对象及其值的getter。 即使有一个,似乎也没有制定者。

所以,我的问题: 是否可以动态更改微调器的范围和值?

提前致谢!

2 个答案:

答案 0 :(得分:1)

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()方法返回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

答案 1 :(得分:-1)

使用#include <iostream> #include <string> int main () { std::string str="We think in generalities, but we live in details."; // (quoting Alfred N. Whitehead) std::string str2 = str.substr (3,5); // "think" std::size_t pos = str.find("live"); // position of "live" in str std::string str3 = str.substr (pos); // get from "live" to the end std::cout << str2 << ' ' << str3 << '\n'; return 0; } getMode()获取模型并将其类型转换为JSpinner,如下所示:

SpinnerModelNumber