ComboBox и ChoiceBox не отображают содержимое

#javafx

#javafx

Вопрос:

ComboBox и CheckBox внутри него находится элемент set https://ibb.co/7YWQfLh , но не отображают содержимое этого элемента https://ibb.co/Mfy2mZb

Я создаю поля в разных панелях ( HBox , VBox AnchorPane , GridPane ,, , ,), результат тот же. Я использовал Enum и обычную строку и результат тот же.

 public class TestFXController {

    @FXML
    private ComboBox<String> asd;

    @FXML
    private ChoiceBox<String> fgh;

    @FXML
    void initialize() {
        ObservableList<String> langs = 
            FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
        asd = new ComboBox<>(langs);
        fgh = new ChoiceBox<>(langs);

    }
}
  
 <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-    Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"     xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="TestFXController">
   <children>
      <ComboBox fx:id="asd" prefWidth="150.0" />
      <ChoiceBox fx:id="fgh" layoutX="14.0" layoutY="70.0" prefWidth="150.0" />
   </children>
</AnchorPane>
  

Что не так. Я хочу этот результат.

https://metanit.com/java/javafx/pics/4.16.png

Ответ №1:

Ваше поле со списком и поле выбора уже существуют, если они должны корректировать fx: идентификаторы, установленные в вашем FXML (asd и fgh), поэтому вам не нужно следующее:

 asd = new ComboBox<>(langs);
fgh = new ChoiceBox<>(langs);
  

С помощью вашего метода инициализации вы можете, например, установить свои элементы в поле со списком следующим образом:

 ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
asd.setItems(langs);
  

Это должно работать нормально, у меня это работает, как вы можете видеть на изображении ниже, при условии, что у вас установлен правильный fx: id (который вы хотите иметь).

введите описание изображения здесь

Надеюсь, это поможет 🙂

Комментарии:

1. Я не уверен, почему я не написал .setItems вместо этого, спасибо, Фабиан, я обновил свой ответ. Что касается ObservableList, я более или менее просто воспользовался тем, что у него было. Возможно, я ответил слишком быстро, но я позволю ему решить, нужен ли ему наблюдаемый список или нет по какой-либо причине.

Ответ №2:

В качестве альтернативы тому, что сказал Роберт, если вы хотите, чтобы в вашем проекте было меньше кода, вы можете добавить элементы в fxml следующим образом

 <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="TestFXController">
    <children>
        <ComboBox fx:id="asd" prefWidth="150.0">
            <items>
                <FXCollections fx:factory="observableArrayList">
                    <String fx:value="Java" />
                    <String fx:value="JavaScript" />
                    <String fx:value="C#" />
                    <String fx:value="Python" />
                </FXCollections>
            </items>
        </ComboBox>
        <ChoiceBox fx:id="fgh" layoutX="14.0" layoutY="70.0" prefWidth="150.0">
            <items>
                <FXCollections fx:factory="observableArrayList">
                    <String fx:value="Java" />
                    <String fx:value="JavaScript" />
                    <String fx:value="C#" />
                    <String fx:value="Python" />
                </FXCollections>
            </items>
        </ChoiceBox>
    </children>
</AnchorPane>
  

Комментарии:

1. Это интересно, я такого раньше не видел! Я все еще новичок в JavaFX и просто пытаюсь ответить на некоторые небольшие вопросы здесь и там, на которые, я думаю, я могу ответить. На этот раз я тоже кое-что узнал.