【发布时间】:2026-01-11 00:25:01
【问题描述】:
在编程或 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”的组合框。
格方根.fxml:
<ComboBox fx:id="chobo_Fisch" prefWidth="150.0"/>
所以我用谷歌搜索了几个小时,但我仍然没有找到任何解决方案来用适用于我的代码的选项填充组合框。我做错了什么?有人可以帮我吗?
最好的问候
詹尼克
【问题讨论】:
-
你为什么只声明字段,而不是局部变量?如果以后不需要访问它,将数据保存在字段中是没有意义的。事实上,这增加了你的类的足迹,除了使某些对象无法用于垃圾收集,即使它们不再需要。此外,我建议对不同的 fxml 使用不同的控制器类。控制器指定初学者最常开始使用的控制器的方法(fx:控制器)导致每次加载 fxml 时都会创建控制器实例。没有来自不同 fxml 的节点可用。