如何使用实现的Setter正确更改SpinnerNumberModel的最大值和最小值

时间:2017-05-09 13:14:05

标签: java swing comparable jspinner

我想实现一个JSpinner SpinnerNumberModelGUI。在构建value, min, max, step 之后,GUI的内容将从ini文件中读取,因此我需要使用Setters中的SpinnerNumberModel更改它们} .class。这些值将作为String从文件中读取,然后解析为double

JSpinnerSpinnerNumberModel在课程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的{​​{1}}和StepSize Value作为传输参数,我可以在实例化Number和{{1}后设置它们它显然是这样工作的。

SpinnerNumberModel的{​​{1}}和JSpinner要求类型Setters。 简单地将双值解析为min(原始类型)或max不会导致异常,但也会导致Comparable不再正常工作。 (初始值既不能通过编辑也不能使用编辑器附带的2个按钮来更改。

当我向我的GUI添加Comparable然后更改值时,我会这样做:

Comparable<Double>

}

如何正确设置值,我应该如何处理JSpinner的需求?

1 个答案:

答案 0 :(得分:0)

我不知道为什么你的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,它们似乎是双倍的,因为这个代码也适用:

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);

正如我所看到的,你必须将步长设为最后一个值为什么,但现在它的工作正常