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) 코딩 스타일입니다.
예, 방금 가져 왔습니다. 그냥 방법 실수. 그럼에도 불구하고 첫 번째 질문은 여전히 남아 있습니다. 왜 CheckBox가 매개 변수화 되었습니까? – Sid
업데이트 된 답변보기 –
그리고'CheckBox'가 아닌'ChoiceBox'를 의미할까요? –