我的 JavaFX 菜单无法正常工作:
public class CreatingMenus {
// Generate Menu
public void initMenu(Stage primaryStage, Group root, Scene scene) {
// Call Menu Actions from Java Method MenuActions
final MenuActions ma = new MenuActions();
MenuBar menuBar = new MenuBar();
// File menu - new, save, close, exit
Menu menu = new Menu("File");
menu.getItems().add(new MenuItem("New"));
menu.getItems().add(new MenuItem("Save"));
menu.getItems().add(new MenuItem("Close"));
menu.getItems().add(new SeparatorMenuItem());
MenuItem menuItem = new MenuItem("Exit");
// Exit from the application
menuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
// This Java Method is called from the Java Class MenuActions
ma.programExit(); // Exit program
}
});
menu.getItems().add(menuItem);
menuBar.getMenus().add(menu);
// Options menu - Preferences
Menu options = new Menu("Options");
options.getItems().add(new MenuItem("Preferences"));
menuBar.getMenus().add(options);
// Help menu - About
Menu help = new Menu("Help");
MenuItem helpItem = new MenuItem("About");
// Exit from the application
helpItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
aboutDialog();
}
});
help.getItems().add(helpItem);
menuBar.getMenus().add(help);
menuBar.prefWidthProperty().bind(primaryStage.widthProperty());
menuBar.setLayoutX(0);
menuBar.setLayoutY(0);
root.getChildren().add(menuBar);
}
public void aboutDialog() {
final int xSize = 640;
final int ySize = 480;
final String logoImage = "/logo.png";
final Color backgroundColor = Color.WHITE;
final String text = "SQL Browser";
final String version = "Product Version: 1.0";
final String license = "License Information";
final Stage aboutDialog = new Stage();
aboutDialog.initModality(Modality.WINDOW_MODAL);
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 20, 20, 20));
// Logo
Image image = new Image(getClass().getResourceAsStream(logoImage));
ImageView logo = new ImageView(image);
grid.add(logo, 1, 0);
// Product name
Text productName = new Text(text);
productName.setFont(Font.font("Verdana", 12));
grid.add(productName, 0, 2);
// Product version
Text productVersion = new Text(version);
productVersion.setFont(Font.font("Verdana", 12));
grid.add(productVersion, 0, 3);
// Product License
Text productLicense = new Text(license);
productLicense.setFont(Font.font("Verdana", 12));
grid.add(productLicense, 0, 4);
// Close Button
Button closeButton = new Button("Close");
closeButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// Close the dialog when "Close" button is pressed
aboutDialog.close();
}
});
grid.add(closeButton, 5, 18);
// Configure dialog size and background color
Scene aboutDialogScene = new Scene(grid, xSize, ySize, backgroundColor);
aboutDialog.setScene(aboutDialogScene);
aboutDialog.show();
}
}
当我添加此菜单时,它会覆盖应用程序中的其他组件,并且它们不负责,因为我认为它们位于该层后面。你能告诉我如何将此菜单隔离在单独的层中,因为我不想将其他组件放在后面。
编辑
当我使用菜单代码时,我得到以下结果:
当我删除菜单代码时,我得到这个结果并且应用程序正常工作:
问题出现在菜单代码中。
最佳答案
场景宽度绑定(bind)
舞台宽度包含窗口边框和标题栏 - 与内部布局无关。
要使用绑定(bind)来填充场景宽度,请将事物的首选尺寸绑定(bind)到场景尺寸而不是舞台尺寸:
menuBar.prefWidthProperty().bind(menuBar.getScene().widthProperty());
或者(通常是首选)您可以使用备用布局 Pane 和布局约束来自动执行大小调整。对于您的特定布局,BorderPane可能有用。
您的实现可能存在其他问题,从而导致出现问题(我尚未检查)。
使用组进行布局
您的pastebin代码使用Group主场景布局根。对于像您的示例一样布置灵活尺寸的屏幕,组通常是一个糟糕的选择。组的大小不可调整。相反,建议使用可调整大小的 layout pane如上所述。
工具支持
- ScenicView对于调试现有布局问题非常有用。
- SceneBuilder非常适合各种布局的快速原型(prototype)设计。
我强烈建议使用这些工具来帮助了解布局的工作原理,并为您提供自行调试布局问题所需的工具和知识。
关于java - 将菜单调整为图层大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163682/