【问题标题】:Switching between Scenes in Java fx with fxml files and an Controller使用 fxml 文件和控制器在 Java fx 中的场景之间切换
【发布时间】:2018-08-10 13:44:08
【问题描述】:

在这个程序中,我想通过按钮单击在场景之间切换。我在要设置 FXML 加载器位置的行上遇到异常。在其他教程或帖子中,我看到它以与我相同的方式完成。我还检查了 fxml 文件的路径一百次。

所以特殊情况是从带有tableViewQuestion.fxml的fxml的QuestionTableViewController切换到带有Controller UserTableViewController的tableViewUser.fxml。至少我在 MyApplication 中启动程序。

该异常是否会到达,因为我的类是可实现初始化的?如果是,为什么以及如何解决这个问题? 或者可能是因为我对 fxml 文件有不同的控制器?但是为什么以及如何解决这个问题?

所以现在我问你,我在那个程序上的愚蠢错误在哪里?

带有 switchMethod 的控制器:

public class QuestionTableViewController implements Initializable{
    @FXML
        TableView<Question> questionTable;
    public void changeToUserDatabase() throws IOException {
         Scene quizScene = new Scene(FXMLLoader.load(getClass().
                           getResource("src/view/tableViewUser.fxml")));
        Stage primaryStage = (Stage) questionTable.getScene().getWindow();
        primaryStage.setScene(quizScene);
        primaryStage.show();
    }}

启动方法:

public class MyApplication extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("view/tableViewQuestion.fxml"));
        primaryStage.setTitle("Database of Century");
        primaryStage.setScene(new Scene(root, 750, 500));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

PS:我只是展示了我认为需要的方法,当然我有一个带有 onMouseClick 方法的按钮和我的 tableView 的内容。如果您认为它们可能相关,请提交,我将在问题中添加。 :)

【问题讨论】:

  • a) src 是包含源文件的目录。它不是包结构的一部分。 b)您使用的路径是相对于类的包的。您正在寻找位于/controller/src/view/tableViewUser.fxml 的资源,您应该使用正确的绝对路径:/view/tableViewUser.fxml
  • 感谢,但它也不适用于仅 /view/tableViewUser.fxml

标签: java user-interface javafx java-8


【解决方案1】:

问题是您试图在错误的位置访问资源。根据我在this question 中阅读的内容,您应该上一个目录才能正确访问fxml 文件。 试试这个:

    Parent root = FXMLLoader.load(getClass().getResource("../view/tableViewQuestion.fxml"));

.. 应该表示正在查看父目录。

编辑:

以上内容在打包的 jar 中不起作用。为了轻松解决您的问题,请在视图包中创建一个类并使用它来加载资源。

例如在src/view 中创建类ViewLoader 并按如下方式加载您的fxml 文件:

    Parent root = FXMLLoader.load(ViewLoader.class.getResource("tableViewQuestion.fxml"));

【讨论】:

  • 您不能在资源名称中使用 ..,因为它不是有效的 Java 标识符:请参阅 stackoverflow.com/questions/34755630/…。尤其是应用打包成jar文件的时候就不行了。
  • 这是有道理的。所以我想最好的办法是在包内创建一个类来加载资源?
  • 这就是我通常所做的(实际上,我通常将 FMXL 和它的控制器打包在一起,因此控制器类可以用于此目的)。另一种方式就是使用绝对路径。
  • 我通常也将控制器和 FXML 放在一起,在我看来它更容易找到东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
相关资源
最近更新 更多