如何在JavaFx中为多个场景实现一个菜单栏 - java

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

场景:

我有3个场景,我想要一种添加菜单栏的方法,这样我就不会从前一场景中显式删除菜单栏并将其添加到新场景。就像将父场景或某种方式的菜单栏附加到舞台上一样。我的意思是菜单栏只添加了一次,无论前面是否有场景,总会出现。

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

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

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并添加到其他场景或只是添加到新场景。所以每次我更换时都必须这样做。有什么办法可以避免这种情况?

参考方案

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

scene.setRoot(borderPane);

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

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

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

borderPane.setCenter(webView);

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

JavaFX FXML无效类型 - java

我正在Linux中用Eclipse编写JavaFX应用程序,并使用SceneBuilder编写了某些FXML代码。当我移至Windows时,如果我尝试执行代码,它将运行良好,但是,如果我尝试修改fxml文件,它将开始给我一个错误(与修改无关)。我也尝试使用NetBeans,但没有任何改变。错误是:javafx.fxml.LoadException: Ligh…

JavaFX 2.2:如何将String绑定到Integer? - java

我正在尝试以下代码,但无法编译:SimpleIntegerProperty startPageProperty = new SimpleIntegerProperty(); TextField startPageField = new TextField(); Bindings.bindBidirectional( startPageField.textPr…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…