我的问题很简单,遗憾的是我无法找到答案。
基本上,我有一个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。
即使有一个,似乎也没有制定者。
所以,我的问题: 是否可以动态更改微调器的范围和值?
提前致谢!
答案 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
都是Number
,SpinnerNumberModel
支持的所有子类都是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