JavaFX应用程序菜单

时间:2016-02-11 22:11:20

标签: javafx menu

所以我看了一下,但是我找不到任何关于如何在JavaFX中创建应用程序菜单的信息。

我见过一个项目“Jayatana”,似乎允许应用程序在Ubuntu中至少使用Intellij(例如)。

我还看到一些建议,使用类似下面的内容将适用于OS X用户: -

$num = 0.59;
echo trim(money_format("%=0#2.2n", (float)$num));

还有NSMenuFX项目,再次针对OS X.

我还看到了java-gnome项目,我认为该项目仅适用于Swing。

但我真正喜欢的是制作应用程序菜单的一些方法,最好是以非特定于操作系统的方式。

我很高兴使用第三方罐子或任何重负荷的东西,但实际上,这样的事情是否存在?

此时我最好的选择是使用Swing创建JavaFX应用程序的shell并使用将应用程序菜单与Swing集成的方法吗?如果是这种情况,那么是否可以从JavaFX自动执行此操作并处理不同实现的切换?

修改

最后,我简单地使用了Swing和JavaFX的组合。我把JavaFX应用程序放在里面,允许我使用已经在Swing中运行的应用程序菜单。

不理想,但确实有效。

3 个答案:

答案 0 :(得分: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提到的任何其他项目。

答案 1 :(得分: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 :(得分:0)

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

private static final double SCREENWIDTH = 615.0;     私有静态最终双精度SCREENHEIGHT = 635.0; enter code here     私有GridPane根= new 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;
}