2017-05-09 54 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

相關問題