我基本上是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上,并且可以在SplitPane
和WebView
之间切换
我正在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:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…