如何用适用的Setters正确更改SpinnerNumberModel的最大值和最小值
我想实现一个JSpinner
,其中SpinnerNumberModel
到GUI
。对于value, min, max, step
的值是从后GUI
被建成了ini文件读,所以我需要从SpinnerNumberModel
类与Setters
改变它们。从文件中读取值为String
,然后解析为double
。如何用适用的Setters正确更改SpinnerNumberModel的最大值和最小值
的JSpinner
和SpinnerNumberModel
一类InputSpinner
实现:
public class InputSpinner implements ChangeListener {
JSpinner component;
SpinnerNumberModel model;
//empty constructor
public InputSpinner() {
model = new SpinnerNumberModel();
component = new JSpinner(model);
JComponent field = ((JSpinner.DefaultEditor) component.getEditor());
Dimension prefSize = field.getPreferredSize();
prefSize = new Dimension(50, prefSize.height);
field.setPreferredSize(prefSize);
component.addChangeListener(this);
}
//constructor with name
public InputSpinner(String name) {
model = new SpinnerNumberModel();
component = new JSpinner(model);
component.setName(name);
JComponent field = ((JSpinner.DefaultEditor) component.getEditor());
Dimension prefSize = field.getPreferredSize();
prefSize = new Dimension(50, prefSize.height);
field.setPreferredSize(prefSize);
component.addChangeListener(this);
}
//basic properties for all possible components
public void setName(String componentName) {
component.setName(componentName);
}
public void setToolTipText(String tooltip) {
component.setToolTipText(tooltip);
}
public void setValue (Number value) {
model.setValue(value);
}
public void setMaximum (Number max) {
model.setMaximum((Comparable<Double>)max);
}
public void setMinimum (Number min) {
model.setMinimum((Comparable<Double>)min);
}
public void setStepSize (Number step) {
model.setStepSize(step);
}
//getter for item
public JComponent getComponent() {
return this.component;
}
}
由于Setters
为StepSize
和Value
已经Number
作为传输参数,我可以实例化两个SpinnerNumberModel
后,将它们与JSpinner
并obviosly这样工作。
Setters
对于min
和max
否则要求类型Comparable
。 只需将双精度值解析为Comparable
(原始类型)或Comparable<Double>
不会导致异常,但也会导致JSpinner
无法正常工作。 (初始值不能通过编辑或使用编辑器附带的2个按钮来改变)。
当我添加一个JSpinner
我的GUI,然后改变我不喜欢这样的价值观:
public class main {
public static void main(String[] args) {
JFrame frame = new JFrame("frame");
InputSpinner spinner = new InputSpinner("spinner");
frame.add(spinner.getComponent());
spinner.setValue(some double value I got from ini-file); //works properly
spinner.setStepSize(some double value I got from ini-file); //works properly
spinner.setMinimum(some double value I got from ini-file); //causes problems
spinner.setMaximum(some double value I got from ini-file); //causes problems
frame.pack();
frame.setVisible(true);
return;
}
}
我正确设置的值怎么办,分别应该怎么处理需求为Comparable
?
我不知道为什么你的设置方法不能使用double,但我找到了使用double作为current,min,max和stepsize的方法。
如果你创建你的模型,你传递值构造是这样的:
double current = 5.7;
double min = (double) 5.5;
double max = (double) 7.3;
double step = 0.1;
model = new SpinnerNumberModel(current, min, max, step);
不要紧哪些值使用,但他们似乎如果你想进一步加倍使用双待,因为那么这个代码工作,以及:
JFrame frame = new JFrame("frame");
InputSpinner spinner = new InputSpinner("spinner");
frame.add(spinner.getComponent());
spinner.setValue(5.1);
spinner.setMinimum(1.0);
spinner.setMaximum(25.3);
spinner.setStepSize(2.5);
frame.pack();
frame.setVisible(true);
,因为我看到它,你必须设置步长为最后一个值somewhy,但现在它工作得很好
你是对的,诀窍是使用已经有4个double值作为传递参数的模型的构造器(我使用了一些随机值,因为我将它们设置为另一个值)然后AND将step设置为最后一个值。然后它工作! 请编辑您的第二个代码片段,您使用的Setters在'SpinnerNumberModel'中实现,而不是在'JSpinner'中实现! (它需要是'model.set ....' – Vito
在我看来,只需更换数wi在你的设置方法中使用'double'。无需任何铸造或转换;它将被编译器自动执行以满足对SpinnerNumberModel方法的调用。 – VGR