用选择填充组合框

时间:2019-05-22 09:08:31

标签: java javafx combobox fxml

在编程或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”中,最重要的是使我进入第二个窗口的按钮:

Scene-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 个答案:

答案 0 :(得分:3)

我发现了三种变体,具体取决于您的设置:

第一个变体

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

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

(来源:https://www.geeksforgeeks.org/javafx-combobox-with-examples/

第二个变种

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>

修改

如fabian所述,您应确保包括FXML导入:

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

可能不需要第二个。

答案 1 :(得分:1)

我对这些东西并不陌生,但是我认为如果我了解您想要的东西,它应该看起来或至少接近。  下面的示例:

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

注意:我是stackoverflow的新手。

答案 2 :(得分:0)

尝试一下:

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

答案 3 :(得分:0)

您的组合框必须装有项目(以您的情况为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的类,您在其中实现应显示对象的哪个字段。