java - 如何在javaFx中实现一个菜单栏用于多个场景

标签 java oracle javafx javafx-2

我基本上是 Java FX 2 的新手。

场景:

我有 3 个场景,我想要一种添加菜单栏的方法,这样我就不想显式地从前一个场景中删除菜单栏并将其添加到新场景中。就像父场景或菜单栏以某种方式附加到舞台上一样。我的意思是菜单栏仅添加一次,并且无论前面是否存在场景,菜单栏始终存在。

如果这是可能的,我该怎么做。

这里是JavaFX的Oracle文档提供的默认示例http://docs.oracle.com/javafx/2/ui_controls/MenuSample.java.html

public class Main extends Application {
 final ImageView pic = new ImageView();
 final Label name = new Label();
 final Label binName = new Label();
 final Label description = new Label();

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

 @Override
 public void start(Stage stage) {

   stage.setTitle("Menu Sample");
   Scene scene = new Scene(new VBox(), 400, 350);
   scene.setFill(Color.OLDLACE);

   MenuBar menuBar = new MenuBar();

   // --- Graphical elements
    final VBox vbox = new VBox();
    vbox.setAlignment(Pos.CENTER);
    vbox.setSpacing(10);        
    vbox.setPadding(new Insets(0, 10, 0, 10));
    makeContentsForVBox();// in this vBox area will be fill with name pic desrciption
    vbox.getChildren().addAll(name, binName, pic, description); // name is lable


   // --- Menu File
    Menu menuFile = new Menu("File");
    MenuItem add = new MenuItem("Shuffle",
        new ImageView(new Image(getClass().getResourceAsStream("new.png"))));
    add.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {
            shuffle();
            vbox.setVisible(true);
        }
    });

    MenuItem clear = new MenuItem("Clear");
    clear.setAccelerator(KeyCombination.keyCombination("Ctrl+X"));
    clear.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {
            vbox.setVisible(false);
        }
    });

    MenuItem exit = new MenuItem("Exit");
    exit.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {
            System.exit(0);
        }
    });

    menuFile.getItems().addAll(add, clear, new SeparatorMenuItem(), exit);
    ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);

    stage.setScene(scene);
    stage.show();
 }
}

所以这里menuBar被添加到场景中。如果我交换场景并将另一个场景放在前面......我会做什么。我想我从这个场景中删除了 menuBar 并添加到其他场景或只是添加到新场景。所以每次我改变的时候都必须这样做。有什么办法可以避免这种情况吗?

最佳答案

我更喜欢的方法是使用以 BorderPane 作为根的 Scene

scene.setRoot(borderPane);

您可以将 MenuBar 添加到 BorderPane 的顶部,并在其中心 放置 SplitPane

BorderPane borderPane = new BorderPane();
borderPane.setTop(menuBar);
borderPane.setCenter(splitPane);

每当您需要切换到 WebView 时,只需将其替换为 SplitPane 即可:

borderPane.setCenter(webView);

按照这种方法,您的 MenuBar 将始终保持在 TOP 上,并且您可以在 SplitPaneWebView 之间切换

关于java - 如何在javaFx中实现一个菜单栏用于多个场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543015/

相关文章:

java - CompletableFuture 和异常(exception) - 这里缺少什么?

java - 获取 .jar 文件旁边的文件夹的位置

java - 为什么 IntStream.average() 总是返回正确的结果而 LongStream.average() 有时却不能?

graphics - 同时旋转和平移在 javafx 中未按预期工作

java - 回调<P,R> 和函数<T,R> 之间的区别

java - 在父 FXML Controller 中调用方法时出现错误和无限循环

javafx.scene.control.TableColumn 不能转换为 javafx.scene.control.TableColumn$CellDataFeatures

SQL 如何在 SUM 中使用 LAG

sql - 为什么 Oracle SQL Optimizer 忽略该 View 的索引谓词?

java - org.springframework.web.client.RestClientException : Could not write request: no suitable HttpMessageConverter found for request type