Javafx NavBar Issue



我一直在我的一个项目中使用Javafx作为GUI。它应该具有添加条目,删除条目,查看条目,修改条目和搜索条目的功能。我已经完成了所有这些事情,并一直在试图使GUI清洁更清洁,同时将Navbar放在顶部,同时将其余的GUI更改在手头上进行了更改。但是,它一直在显示一些我一直无法修复的特殊行为。

这是代码的相关部分:

private static Scene makeScene(Stage primaryStage, BorderPane searchRoot, BorderPane addRoot, BorderPane viewRoot){
    final Scene[] scene = {null};
    final Scene searchScene;
    final Scene addScene;
    final Scene viewScene;
    final int WIDTH = 500;
    final int HEIGHT = 600;
    HBox navBar = new HBox(15);
    Button searchButton = new Button("Search People");
    Button addButton    = new Button("Add Person");
    Button viewButton   = new Button("View People");
    navBar.getChildren().addAll(searchButton, addButton, viewButton);
    navBar.setAlignment(Pos.CENTER);
    navBar.setPrefHeight(42);
    searchRoot.setTop(navBar);
    addRoot.setTop(navBar);
    viewRoot.setTop(navBar);
    searchScene = new Scene(searchRoot, WIDTH, HEIGHT);
    addScene    = new Scene(addRoot,    WIDTH, HEIGHT);
    viewScene   = new Scene(viewRoot,   WIDTH, HEIGHT);
    scene[0] = viewScene;
    searchButton.setOnAction((ActionEvent event) -> {
        System.out.println("Search Button Pressed");
        scene[0] = searchScene;
        primaryStage.setScene(scene[0]);
    });
    addButton.setOnAction((ActionEvent event) -> {
        System.out.println("Add Button Pressed");
        scene[0] = addScene;
        primaryStage.setScene(scene[0]);
    });
    viewButton.setOnAction((ActionEvent event) -> {
        System.out.println("Soup");
        scene[0] = viewScene;
        primaryStage.setScene(scene[0]);
    });
    return scene[0];
}

以这种方式调用:

    primaryStage.setScene(makeScene(primaryStage, searchRoot, addRoot, viewRoot));
    primaryStage.show();

按下Navbar上的任何按钮时,它确实切换到适当的面板,但是Navbar本身会消失,从而使进一步的导航不可能。我最好的猜测是因为它在试图改变的东西内部的纳维尔"生活",但我不确定这一点。我很感激有人告诉我为什么这是为什么我的预期不起作用的原因,也是关于如何解决此问题的建议。

您的猜测或多或少是正确的。primaryStage.setScene(...)将替换舞台的全部内容。此外,节点只能具有单亲节点,因此当将navBar设置为三个不同BorderPane s的顶部时,该行为是不确定的。(i think 它最终只会出现在最后一个,viewRoot,但这完全取决于实现。)

我建议您重构:使用BorderPane作为(一个和唯一)Scene的根。将导航栏放在边框窗格的顶部,并通过在边框窗格上调用setCenter(...),以适当的方式通过searchRootaddRootviewRoot

类似:

private static void makeScene(Stage primaryStage, Node searchRoot, Node addRoot, Node viewRoot){
    final int WIDTH = 500;
    final int HEIGHT = 600;
    BorderPane root = new BorderPane();
    final Scene scene = new Scene(root, WIDTH, HEIGHT);

    HBox navBar = new HBox(15);
    Button searchButton = new Button("Search People");
    Button addButton    = new Button("Add Person");
    Button viewButton   = new Button("View People");
    navBar.getChildren().addAll(searchButton, addButton, viewButton);
    navBar.setAlignment(Pos.CENTER);
    navBar.setPrefHeight(42);
    root.setTop(navBar);
    searchButton.setOnAction((ActionEvent event) -> {
        System.out.println("Search Button Pressed");
        root.setCenter(searchRoot);
    });
    addButton.setOnAction((ActionEvent event) -> {
        System.out.println("Add Button Pressed");
        root.setCenter(addRoot);
    });
    viewButton.setOnAction((ActionEvent event) -> {
        System.out.println("Soup");
        root.setCenter(viewRoot);
    });
    primaryStage.setScene(scene);
}

相关内容

  • 没有找到相关文章

最新更新