在JavaFX中的菜单栏中右对齐菜单

时间:2016-09-01 22:25:20

标签: menu javafx-8

By中,可以使用以下菜单在菜单栏的右侧放置菜单:

Java Swing

这会在左边放menubar.add(menu1); menubar.add(Box.createHorizontalGlue()); menubar.add(menu2); ,在右边放menu1。这个功能(显然)在menu2中不可用。

JavaFX中,我看到使用以下工具栏可以实现相同的目的:

JavaFX

虽然这种解决方法不适用于菜单。

问题:有没有办法为final Pane rightSpacer = new Pane(); HBox.setHgrow( rightSpacer, Priority.SOMETIMES ); 中的菜单创建正确的间隔?

2 个答案:

答案 0 :(得分:3)

一种轻微的hacky方式是在HBox中使用两个菜单栏。您可以通过向其添加menu-bar样式类来为间隔符分隔它们与菜单栏相同的样式:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.stage.Stage;

public class MenuAlignment extends Application {

    @Override
    public void start(Stage primaryStage) {
        MenuBar leftBar = new MenuBar();
        leftBar.getMenus().addAll(new Menu("File"), new Menu("Edit"));
        MenuBar rightBar = new MenuBar();
        rightBar.getMenus().addAll(new Menu("Help"));
        Region spacer = new Region();
        spacer.getStyleClass().add("menu-bar");
        HBox.setHgrow(spacer, Priority.SOMETIMES);
        HBox menubars = new HBox(leftBar, spacer, rightBar);

        BorderPane root = new BorderPane();
        root.setTop(menubars);
        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

enter image description here

此方法的一个潜在缺点是您无法将其用作system menu bar

答案 1 :(得分:0)

你可以在javafx中嵌入swing。这方面的一个例子是

import javafx.application.Application;
import     javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.JButton;
import javax.swing.SwingUtilities;

public class SwingFx extends Application {

    @Override
    public void start (Stage stage) {
        final SwingNode swingNode = new SwingNode();

        createSwingContent(swingNode);

        StackPane pane = new StackPane();
        pane.getChildren().add(swingNode);

        stage.setTitle("Swing in JavaFX");
        stage.setScene(new Scene(pane, 250, 150));
        stage.show();
        }

    private void createSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                swingNode.setContent(new JButton("Click me!"));
        }
    });
  }
}

因此您希望将JButton()替换为您想要嵌入的内容。

(代码段取自Oracles official documents