所以我看了一下,但是我找不到任何关于如何在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中运行的应用程序菜单。
不理想,但确实有效。
答案 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;
}