2017-05-09 133 views
0

我想实现一个JSpinner,其中SpinnerNumberModelGUI。对于value, min, max, step的值是从后GUI被建成了ini文件读,所以我需要从SpinnerNumberModel类与Setters改变它们。从文件中读取值为String,然后解析为double如何用适用的Setters正确更改SpinnerNumberModel的最大值和最小值

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

由于SettersStepSizeValue已经Number作为传输参数,我可以实例化两个SpinnerNumberModel后,将它们与JSpinner并obviosly这样工作。

Setters对于minmax否则要求类型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

+0

在我看来,只需更换数wi在你的设置方法中使用'double'。无需任何铸造或转换;它将被编译器自动执行以满足对SpinnerNumberModel方法的调用。 – VGR

回答

0

我不知道为什么你的设置方法不能使用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,但现在它工作得很好

+0

你是对的,诀窍是使用已经有4个double值作为传递参数的模型的构造器(我使用了一些随机值,因为我将它们设置为另一个值)然后AND将step设置为最后一个值。然后它工作! 请编辑您的第二个代码片段,您使用的Setters在'SpinnerNumberModel'中实现,而不是在'JSpinner'中实现! (它需要是'model.set ....' – Vito

相关问题