如何使用已实现的设置器正确更改 SpinnerNumberModel 的最大值和最小值
How to change max and min of a SpinnerNumberModel properly with the implemented Setters
我想实现 JSpinner
和 SpinnerNumberModel
到 GUI
。 value, min, max, step
的值是在 构建 GUI
之后从 ini 文件 中读取的,因此我需要使用 Setters
来更改它们SpinnerNumberModel
class。这些值作为 String
从文件中读取,然后解析为 double
.
JSpinner
和 SpinnerNumberModel
实现在 class 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;
}
}
由于 StepSize
和 Value
的 Setters
具有 Number
作为传输参数,我可以在实例化 SpinnerNumberModel
和 JSpinner
它显然是这样工作的。
Setters
为 min
和 max
否则要求类型 Comparable
。
简单地将 double 值解析为 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
的需求?
我不知道为什么你的 set 方法不能与 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);
你使用哪个值并不重要,但如果你想进一步使用 double,它们似乎是 double,因为这样代码也可以工作:
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);
正如我所见,你必须将步长设置为最后一个值,但现在它工作得很好
我想实现 JSpinner
和 SpinnerNumberModel
到 GUI
。 value, min, max, step
的值是在 构建 GUI
之后从 ini 文件 中读取的,因此我需要使用 Setters
来更改它们SpinnerNumberModel
class。这些值作为 String
从文件中读取,然后解析为 double
.
JSpinner
和 SpinnerNumberModel
实现在 class 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;
}
}
由于 StepSize
和 Value
的 Setters
具有 Number
作为传输参数,我可以在实例化 SpinnerNumberModel
和 JSpinner
它显然是这样工作的。
Setters
为 min
和 max
否则要求类型 Comparable
。
简单地将 double 值解析为 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
的需求?
我不知道为什么你的 set 方法不能与 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);
你使用哪个值并不重要,但如果你想进一步使用 double,它们似乎是 double,因为这样代码也可以工作:
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);
正如我所见,你必须将步长设置为最后一个值,但现在它工作得很好