Заполнение Combobox с выбором - PullRequest
0 голосов
/ 22 мая 2019

Я только начинающий, когда дело доходит до программирования или Java. Поэтому для начала я планировал создать окно, использующее JavaFX (в сочетании с компоновщиком сцен), где у меня есть кнопка, которая ведет меня в другое окно, где у меня есть выпадающий список. Я часами гуглял, чтобы найти способ заполнить этот комбобокс выбором, но все найденные мной решения не работают для меня. Вот почему я думаю, что допустил здесь некоторые ошибки и надеюсь, что вы мне как-то поможете. Или в списке дать мне подсказку, что я должен изучить / прочитать, чтобы найти решение самостоятельно. Итак, для начала, вот мой main.java-код, где я строю свой первый этап.

main.java:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root= FXMLLoader.load(getClass().getResource("Scene-Hauptmenu.fxml"));
            primaryStage.setTitle("Fishbase");
            primaryStage.sizeToScene();
            primaryStage.setResizable(false);
            primaryStage.setScene(new Scene(root));
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }       
    }

    public static void main(String[] args) {
        launch(args);
    }   
}

В моем "Scene-Hauptmenu.fxml" все, что имеет значение, это кнопка, которая ведет меня ко второму окну:

Сцена-Hauptmenu.fxml:

<Button id="btn_gefangen" fx:id="btn_gefangen" mnemonicParsing="false" onAction="#gefangen" text="Ich habe Fische gefangen!" GridPane.rowIndex="1" />

Пока все работает нормально, и я могу без проблем переключиться на второе окно. Но я думаю, что моя основная проблема заключается в моем классе контроллера, так что вот оно.

MyController.java:

public class MyController implements Initializable{
    private Node node;
    private Stage stage;
    private Scene scene;
    private FXMLLoader fxmlLoader;
    private Parent root;

    @FXML
    private Button btn_gefangen;

    @FXML
    private ComboBox<String> chobo_fisch; 

    @FXML
    private Button btn_gefangen_zurueck;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    public void gefangen(ActionEvent event) throws IOException{

        node = (Node) event.getSource();
        stage = (Stage) node.getScene().getWindow();
        scene = stage.getScene();

        fxmlLoader = new FXMLLoader (getClass().getResource("gefangen.fxml"));

        root = (Parent) fxmlLoader.load();
        scene.setRoot(root);
        stage.sizeToScene();
        stage.setTitle("Fische eintragen");          
    }


    public void gefangen_zurueck(ActionEvent event) throws IOException{
        node = (Node) event.getSource();
        stage = (Stage) node.getScene().getWindow();
        scene = stage.getScene();
        fxmlLoader = new FXMLLoader (getClass().getResource("Scene-Hauptmenu.fxml"));
        root = (Parent) fxmlLoader.load();
        scene.setRoot(root);
        stage.sizeToScene();
        stage.setTitle("Fishbase");     
    }   
}

Таким образом, кнопка "btn_gefangen" ведет меня к тому другому окну, где у меня есть выпадающий список с fx: id "chobo_fisch".

gefangen.fxml:

<ComboBox fx:id="chobo_Fisch" prefWidth="150.0"/>

Так что я часами гуглял, но все еще не нашел никакого решения, чтобы заполнить комбинированный список вариантами, которые работают с моим кодом. Что я сделал не так? Кто-нибудь может мне здесь помочь?

С наилучшими пожеланиями

Jannik

Ответы [ 4 ]

4 голосов
/ 22 мая 2019

Я нашел три варианта, в зависимости от вашей настройки:

1-й вариант

// Weekdays 
String week_days[] = 
    { "Monday", "Tuesday", "Wednesday", 
      "Thrusday", "Friday" }; 

// Create a combo box 
ComboBox combo_box = new ComboBox(FXCollections.observableArrayList(week_days)); 

(Soure: https://www.geeksforgeeks.org/javafx-combobox-with-examples/)

2-й вариант

final ComboBox emailComboBox = new ComboBox();
emailComboBox.getItems().addAll(
            "jacob.smith@example.com",
            "isabella.johnson@example.com",
            "ethan.williams@example.com",
            "emma.jones@example.com",
            "michael.brown@example.com"  
        );

Источник: (https://docs.oracle.com/javafx/2/ui_controls/combo-box.htm)

3-й вариант (для FXML)

<ComboBox fx:id="someName">
     <items>
         <FXCollections fx:factory="observableArrayList">
              <String fx:value="1"/>
              <String fx:value="2"/>
              <String fx:value="3"/>
              <String fx:value="4"/>
          </FXCollections>
      </items>
      <value>
           <String fx:value="1"/>
      </value>
</ComboBox>

Редактировать

Как упомянуто Фабианом, вы должны сделатьобязательно включите импорт FXML:

<?import javafx.collections.FXCollections?>
<?import java.lang.String?>

Второй может не понадобиться.

1 голос
/ 22 мая 2019

Я новичок в этих вещах, но я думаю, что это должно выглядеть или, по крайней мере, близко, если я понял, что вы хотели. Пример ниже:

ComboBox<String> stuff = new ComboBox<>(); stuff.getItems().addAll("1","2","5","10");

Примечание: я новичок в stackoverflow.

0 голосов
/ 22 мая 2019

Ваш комбобокс должен быть заполнен предметами (в вашем случае String):

    List<String> list = new ArrayList<String>();
    list.add("Item 1");
    list.add("Item 2");
    chobo_fisch.setItems(FXCollections.observableArrayList(list));

Если вы используете комбинированный список более сложного объекта, вы можете использовать фабрику ячеек, чтобы выбрать отображаемое значение:

    chobo_fisch.setCellFactory(obj -> new ChoboFischListCell());
    chobo_fisch.setButtonCell(new ChoboFischListCell());

где ChoboFischListCell - это класс, который расширяет ListCell и где вы реализуете, какое поле вашего объекта должно отображаться.

0 голосов
/ 22 мая 2019

Попробуйте это:

ObservableList<String> items = FXCollections.observableArrayList();
    items.add("a");
    items.add("b");
    chobo_fisch.getItems().addAll(items);
...