JavaFX应用程序菜单

5

我已经搜索了很多,但是没有找到如何在JavaFX中创建应用程序菜单的信息。

我看到了一个名为“Jayatana”的项目,似乎可以让应用程序在Ubuntu上拥有适当的应用程序菜单,至少在使用Intellij时(作为示例)。

我还看到一些建议,对于OS X用户,可以使用以下类似的方法:

final List<MenuBase> menus = new ArrayList<>();
menus.add(GlobalMenuAdapter.adapt(menu));
Toolkit.getToolkit().getSystemMenu().setMenus(menus);

还有一个名为NSMenuFX的项目,同样适用于OS X。

我也看到了java-gnome项目,我认为它只适用于Swing。

但我真正想要的是以非特定于操作系统的方式创建应用程序菜单。

我很乐意使用第三方jar或其他任何可以完成繁重工作的工具,但是,是否存在类似于此的东西呢?

这时,我最好的选择是使用Swing创建JavaFX应用程序的外壳,并使用与Swing集成应用程序菜单的方法。如果是这种情况,是否有一些可以自动从JavaFX中处理并切换不同实现的工具呢?

编辑

最终,我只是简单地使用了Swing和JavaFX的组合。我将JavaFX应用程序放在内部,这使我可以使用已经在Swing中工作的应用程序菜单。

虽然不是理想的解决方案,但确实可行。


1
自 Java 9 开始,java.awt.Desktop 类已经添加了一些方法,部分支持真正的应用菜单,例如 setPreferencesHandlersetAboutHandler - VGR
3个回答

3
我认为您只需要查找MenuBar.useSystemMenuBarProperty()。如果在菜单栏上调用此方法,则如果平台支持系统菜单(例如OS X),则菜单将不会出现在场景图中,而是作为系统菜单使用。

SSCCE:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class SystemMenuExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        MenuBar menuBar = new MenuBar();
        Menu menu = new Menu("File");
        MenuItem quit = new MenuItem("Quit");
        quit.setOnAction(e -> Platform.exit());
        menu.getItems().add(quit);
        menuBar.getMenus().add(menu);
        menuBar.setUseSystemMenuBar(true);

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

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

2

James_D 提供的解决方案是JavaFX中处理这个问题的标准方法,但是这种解决方案在Mac上不起作用,例如,如果你打算国际化你的应用程序。Mac引入了一些默认菜单项,你无法用这种方式正确地处理它们。这就是NSMenuFX项目发挥作用的地方。

NSMenuFX帮助您

Customize the auto-generated application menu of your JavaFX app
Automatically use the same menu bar for all stages
Create common OS X menus like the Window menu

如果您可以忍受JavaFX解决方案的缺陷,请使用它,否则请查看NSMenuFX或其他Linux提到的项目。

0

这是我的代码。我该如何将它添加到下面的代码中。选择开始后,我想运行游戏

private static final double SCREENWIDTH = 615.0; private static final double SCREENHEIGHT = 635.0;在此输入代码 private GridPane root = new GridPane(); private Scene scene = new Scene(root); private Stage primaryStage; private GameController controller;

private boolean gewonnen;
private boolean pauze;
private int opstartSeconden;
private int aantalLevels;
private List<Level> levels;



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

@Override
public void start(Stage primaryStage) throws NoPathPossibleException, StartAndEndAreThereSameException {
    controller = new GameController(root, scene);// game controler wordt gemaakt
    new Thread(this).start(); // we starten het spel in een nieuwe thread. we 

    this.primaryStage = primaryStage;
    primaryStage.setTitle("HapMan9000");
    primaryStage.setWidth(SCREENWIDTH);
    primaryStage.setHeight(SCREENHEIGHT);
    primaryStage.setResizable(false);
    primaryStage.setScene(scene);



    primaryStage.setOnCloseRequest(e -> closeProgram());

    scene.setCursor(Cursor.NONE);
    primaryStage.show();
    levels = new ArrayList<>();
}

/**
 * Zorgt ervoor dat het spel in zijn geheel wordt afgesloten.
 */
private void closeProgram() {
    Platform.exit();
    System.exit(0);
}

public void spelPauzeren() {
    pauze = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接