0

我有这个无法正常工作的 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();

    }
}

当我添加此菜单时,它会将其他组件覆盖到应用程序中,并且它们不负责,因为我认为它们位于该层后面。你能告诉我如何将这个菜单隔离在单独的层中,因为我不想将其他组件放在后面。

编辑

当我使用菜单代码时,我得到了这个结果:

在此处输入图像描述

当我删除菜单代码时,我得到了这个结果并且应用程序工作正常:

问题出在菜单代码的某个地方。

4

2 回答 2

2

场景宽度绑定

舞台宽度包含窗口边框和标题栏 - 与内部布局无关。

要使用绑定填充场景宽度,请将事物的首选大小绑定到场景大小而不是舞台大小:

menuBar.prefWidthProperty().bind(menuBar.getScene().widthProperty()); 

或者(通常首选)您可以使用自动执行大小调整的备用布局窗格和布局约束。对于您的特定布局,BorderPane可能很有用。

您的实施可能有其他问题导致问题(我没有检查)。

使用组进行布局

您的 pastebin 代码使用一个作为主场景布局根。对于像您的示例那样布置灵活大小的屏幕,组通常是一个糟糕的选择。组不可重新调整大小。相反,建议使用上面提到的可调整大小的布局窗格。

工具支持

  1. ScenicView在调试现有布局问题方面非常有用。
  2. SceneBuilder非常适合各种布局的快速原型制作。

我强烈建议使用这些工具来帮助理解布局的工作原理,并为您提供自己调试布局问题所需的工具和知识。

于 2013-04-23T21:56:50.927 回答
1

为我工作,没有任何改变。您可能应该检查您的 Java/JavaFx 版本。我在 Windows 上使用 1.7_17、64 位。 在此处输入图像描述

我添加了一些图像(我没有你的),以确保你得到的行为不是因为它们。

于 2013-04-23T09:18:26.993 回答