2014-09-08 2 views
1

나는 JavaFX를 연구 중이며 ChoiceBox를보고있다. 질문은 간단합니다. 선택 상자가 이기종 데이터를 전달한다고 가정 할 때 매개 변수화 된 이유는 무엇입니까?JavaFX - ChoiceBox가 매개 변수화 된 이유는 무엇입니까?

이 문제로 인해 가이드 가이드의 구현이 불가능합니다 : http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/choice-box.htm. 심지어 매개 변수화하지 않을 것,

final String[] greetings = new String[] { "Hello", "Hola", "Olá"}; 
final ChoiceBox cb2 = new ChoiceBox(
     FXCollections.observableArrayList("English", "Español", "Portuguese")); 
final Label theText = new Label(greetings[0]); 

cb2.getSelectionModel().selectedItemProperty().addListener(
    (ObservableValue<? extends Number> ov, Number oldValue, Number newValue) -> 
     theText.setText(greetings[newValue.intValue()]) 
); 

컴파일러는 문자열 유형을 보유하고있는 CheckBox 클래스와 호환되지 않는 유형이 있기 때문에 람다가 유효하지 않은보고 :

나는이 코드를 가지고있다. 하지만 <Object>으로 CheckBox를 매개 변수화하면 newValue을 Number 유형으로 캐스팅해야하며 런타임에는 ClassCastException이 Number에 문자열을 캐스트 할 수 없다는 메시지가 나타납니다.

왜 ChoiceBox 클래스를 사용하면 고유 한 유형을 사용할 수 있습니까? Choicebox는 이기종 데이터를 보유해야합니다.

기타 :이 문제로 인해 가이드 용 예제를 어떻게 구현합니까?

답변

3

selectedItem 속성이 선택한 항목의 색인이 될 것으로 예상됩니다. 실제로는 실제 항목 자체입니다. 따라서 String을 입력하는 경우 ChangeListener<String>을 선택한 항목으로 등록하십시오.

색인은 selectedIndex 속성입니다. "그들이 매개 변수화하는 이유"당신이 거기 데이터 형식을 선언 한 다음 올바른 유형을 검색 할 수 있도록 그래서 당신은 질문에 관해서는

final String[] greetings = new String[] { "Hello", "Hola", "Olá"}; 
final ChoiceBox<String> cb2 = new ChoiceBox<String>(
     FXCollections.observableArrayList("English", "Español", "Portuguese")); 
final Label theText = new Label(greetings[0]); 

cb2.getSelectionModel().selectedItemProperty().addListener(
    (ObservableValue<? extends String> ov, String oldValue, String newValue) -> 
     System.out.println("Selected language is: "+newValue) 
); 

cb2.getSelectionModel().selectedIndexProperty().addListener(
    (ObservableValue<? extends Number> ov, Number oldIndex, Number newIndex) -> 
     theText.setText(greetings[newValue.intValue()]) 
); 

을 할 수는 있습니다. ComboBox이 실제로 유형이 다른 경우 (즉, 혼합 데이터 유형이 포함 된 경우) 수행 할 수있는 최선의 방법은 거기에있는 모든 데이터의 가장 일반적인 공통 수퍼 클래스로 선언하는 것입니다. 그래서 예를 들면

(. 당신은 아마이 좋은 디자인을 선택하는 경우 물어보고 싶은) :

ChoiceBox<Object> mixedChoices = new ChoiceBox<>(); 
// Put any Objects in there: 
mixedChoices.getItems().addAll("One", new Integer(2), new Double(3.0)); 

mixedChoices.getSelectionModel().selectedItemProperty().addListener(
    (ObservableValue<? extends Object> ov, Object oldSelection, Object newSelection) -> 
     // compiler will only let me use Object here, but of course that makes sense, as I have no idea 
     // what object is selected.... 
     System.out.println(newSelection.toString()) 
); 

을하지만 더 나은 (IMHO) 방식은 균일 한 ChoiceBox 적절한 개체 유형을 사용하는 것입니다.

ChoiceBox<Locale> languages = new ChoiceBox<>(); 
languages.getItems().addAll(Locale.ENGLISH, new Locale("es"), new Locale("pt")); 
languages.setConverter(new StringConverter<Locale>() { 
    @Override 
    public String toString(Locale l) { 
     return l.getDisplayLanguage(l); 
    } 
    @Override 
    public Locale fromString(String language) { 
     // not really needed, but... 
     return Locale.forLanguageTag(language); 
    } 
}); 

languages.getSelectionModel().selectedItemProperty().addListener(
    (ObservableValue<? extends Locale> ov, Locale oldValue, Locale newValue) -> { 
     ResourceBundle rb = ResourceBundle.getBundle("messages", newValue); 
     theText.setText(rb.getString("greeting")); 
}); 

매개 변수화하지 않고, 그것은

ChoiceBox languages = new ChoiceBox(); 
languages.getItems().addAll(Locale.ENGLISH, ...); 

이 될 것입니다하지만 지금 컴파일러는 우리가 선택 상자에 Locale 년대에 넣어 알 수있는 방법이 없기 때문에 나는 예를 구현하는 것, 그래서 우리는 강제로 다운 캐스트 : 나는 코딩 오류를 확인하고 ChoiceBox에 잘못된 일을 넣으면

languages.getSelectionModel().addListener(
    (ObservableValue ov, Object oldChoice, Object newChoice) -> { 
     // hmm, I know I put Locales in there, even though the complier doesn't: 
     Locale languageChoice = (Locale) newChoice ; 
     // etc 
}); 

물론

문제는 지금, 그것은 단지 인 것을 런타임에 잡았어. 매개 변수가있는 버전에서는 컴파일 할 때 잡히게됩니다. 이것은 기본적으로 Swing에서 수행 된 방식이며, 매우 유산 (이전 JDK5) 코딩 스타일입니다.

+0

예, 방금 가져 왔습니다. 그냥 방법 실수. 그럼에도 불구하고 첫 번째 질문은 여전히 ​​남아 있습니다. 왜 CheckBox가 매개 변수화 되었습니까? – Sid

+1

업데이트 된 답변보기 –

+1

그리고'CheckBox'가 아닌'ChoiceBox'를 의미할까요? –