2017-05-09 2 views
0

SpinnerNumberModelGUI으로 사용하여 JSpinner을 구현하고 싶습니다. value, min, max, step의 값은 이후에 ini-file 에서 읽어들이므로 GUI이 빌드되면 SpinnerNumberModel 클래스에서 Setters으로 변경해야합니다. 값은 파일에서 String으로 읽은 다음 double으로 구문 분석됩니다. 내가 obviosly JSpinner하고 모두 SpinnerNumberModel을 인스턴스화 후에 다시 설정할 수 있습니다, 전송 매개 변수로 Number구현 된 Setter를 사용하여 SpinnerNumberModel의 최대 및 최소를 올바르게 변경하는 방법

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에 대한 SettersValue로 한 :

JSpinnerSpinnerNumberModel는 클래스 InputSpinner에서 구현된다 그렇게 작동합니다.

max의 경우 SettersComparable을 요구합니다. double 값을 Comparable (원시 형식) 또는 Comparable<Double>으로 구문 분석하면 예외가 발생하지 않으며 JSpinner이 더 이상 제대로 작동하지 않습니다. (에디터와 함께 제공되는 2 개의 버튼을 사용해서도 초기 값을 변경할 수 없습니다).

내 GUI에 JSpinner을 추가 한 다음 값이 같은 그것을 변경 :

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

잘 작동 당신의 set-methods에서'double'을 사용하십시오. 어떤 주조 나 전환도 필요 없습니다. 그것은 SpinnerNumberModel 메소드에 대한 호출을 만족시키기 위해 컴파일러에 의해 autoboxed 될 것입니다. – VGR

답변

0

나는 정확히 set 메소드가 double에서는 작동하지 않는 것을 알지 못하지만 double을 현재, 최소, 최대 및 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 값을 가진 모델에 대해 생성자를 사용하고 마지막 값으로 step을 설정하기 위해 전송 매개 변수로 임의의 값을 사용했습니다. 그렇다면 그것은 작동합니다! 두 번째 코드 조각을 편집하십시오. 사용하는 Setters가'Jspinner'가 아니라'SpinnerNumberModel'에 구현되어 있습니다! (그것은'model.set ....'이어야합니다. – Vito

관련 문제