【问题标题】:JavaFX Application MenuJavaFX 应用程序菜单
【发布时间】:2016-05-22 22:10:03
【问题描述】:

所以我环顾四周,但找不到任何有关如何在 JavaFX 中制作应用程序菜单的信息。

我见过一个项目“Jayatana”,它似乎允许应用程序至少在使用 Intellij 的 Ubuntu 中拥有正确的应用程序菜单(例如)。

我还看到了一些建议,即使用以下内容对 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 中工作的应用程序菜单。

不理想,但确实有效。

【问题讨论】:

  • 从 Java 9 开始,java.awt.Desktop class 添加了部分支持真正应用程序菜单的方法,例如 setPreferencesHandler 和 setAboutHandler。

标签: javafx menu


【解决方案1】:

我认为您只是在寻找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 的项目。

    【讨论】:

      【解决方案3】:

      这是我的代码。 Howe 我可以将其添加到我的以下代码中。选择开始后,我想运行游戏

      private static final double SCREENWIDTH = 615.0; 私有静态最终双屏幕高度 = 635.0;enter code here 私有 GridPane 根 = 新 GridPane(); 私有场景场景 = 新场景(根); 私人舞台primaryStage; 私有 GameController 控制器;

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多