2017-05-26 111 views
1

我的问题很简单,不幸的是我找不到答案。 基本上,我有一个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。

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

在此先感谢!

+0

从Spinner获取模型(测试它是否是'instanceof' SpinnerNumberModel')并使用它。 *“所以,我的问题:是否有可能动态地改变微调器的范围和价值?“* - 我还没有尝试过,但是一旦拥有了'SpinnerNumberModel',就可以改变它的属性 – MadProgrammer

+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无法看到微调模型,你可以做一个castJSpinner有一个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); 
      } 
     } 
    } 
}; 

在任一情况下,newMaximumNumber,并且通过SpinnerNumberModel支持的所有子类是Comparable

+0

我甚至没有意识到您可以在使用'SpinnerNumberModel'之后“放”到微调器中,我的听众可以看到微调器,所以我已经使用了第一种解决方案,并且添加了一个小的验证来更新第一个微调器的值(通过它的'SpinnerNumberModel'),如果它高于值第二个微调,非常感谢! –

-1

使用getMode()获得来自JSpinner和模型其类型强制转换为SpinnerModelNumber这样的:

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