无法使用系统菜单栏 Javafx
Can't Use System Menubar Javafx
我想将 JavaFX 菜单栏添加到舞台,但让它使用 Mac 的系统菜单栏。
我的问题是使用:
menuBar.useSystemMenuBarProperty().set(true);
不起作用。我认为问题是因为我的主要方法不是 JavaFX 应用程序的一部分。我的主要方法如下所示:
public class SURPG_Launcher {
public static com.apple.eawt.Application macApp;
public static void main(String[] args) {
if(Toolbox.isMac()) {
initMac(args);
} else {
Application.launch(SURPG_Main.class, args);
}
}
private static void initMac(String[] args) {
System.out.println("MacOS System detected!");
macApp = com.apple.eawt.Application.getApplication();
macApp.setPreferencesHandler(new PreferencesHandler(){
@Override
public void handlePreferences(PreferencesEvent arg0) {
Platform.runLater(() -> {
Stage prefs = new Stage();
prefs.setMinHeight(200);
prefs.setMinWidth(200);
prefs.show();
});
}
});
Application.launch(SURPG_Mac.class, args);
}
}
SURPG_Mac.class 和 SURPG_Main.class 是扩展 JavaFX 应用程序的 classes。
我有另一个 class 设置 GUI,一个带有 BorderPane 的舞台。我还有另一个 class 和 public 静态方法,可以调用它们来设置菜单栏,例如:
public class MenuControl {
public static MenuBar menuBar;
public static Menu menuFile;
public static Menu menuGame;
public static Menu menuTools;
public static MenuItem save;
public static void initMenusMac() {
menuBar = new MenuBar();
Platform.runLater(() -> {
menuBar.useSystemMenuBarProperty().set(true);
});
menuFile = new Menu("File");
menuGame = new Menu("Game");
menuTools = new Menu("Tools");
save = new MenuItem("Save");
menuFile.getItems().add(save);
menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
GUI_Main.totalLay.setTop(menuBar);
}
public static void initMenus() {
menuBar = new MenuBar();
menuFile = new Menu("File");
menuGame = new Menu("Game");
menuTools = new Menu("Tools");
save = new MenuItem("Save");
menuFile.getItems().add(save);
menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
GUI_Main.totalLay.setTop(menuBar);
}
}
我的最后一点是我无法更改它,因此主要方法在 SURPG_Mac 或 SURPG_Main 中,因为 Mac 集成存在不同的兼容性问题。
谁能帮我解决这个问题?
在此先感谢您!
看看这个项目:https://github.com/codecentric/NSMenuFX 它可以让你有一个更像 mac 的菜单栏。但是在使用它之前,您可能还必须清理有点奇怪的项目设置。
我想将 JavaFX 菜单栏添加到舞台,但让它使用 Mac 的系统菜单栏。
我的问题是使用:
menuBar.useSystemMenuBarProperty().set(true);
不起作用。我认为问题是因为我的主要方法不是 JavaFX 应用程序的一部分。我的主要方法如下所示:
public class SURPG_Launcher {
public static com.apple.eawt.Application macApp;
public static void main(String[] args) {
if(Toolbox.isMac()) {
initMac(args);
} else {
Application.launch(SURPG_Main.class, args);
}
}
private static void initMac(String[] args) {
System.out.println("MacOS System detected!");
macApp = com.apple.eawt.Application.getApplication();
macApp.setPreferencesHandler(new PreferencesHandler(){
@Override
public void handlePreferences(PreferencesEvent arg0) {
Platform.runLater(() -> {
Stage prefs = new Stage();
prefs.setMinHeight(200);
prefs.setMinWidth(200);
prefs.show();
});
}
});
Application.launch(SURPG_Mac.class, args);
}
}
SURPG_Mac.class 和 SURPG_Main.class 是扩展 JavaFX 应用程序的 classes。
我有另一个 class 设置 GUI,一个带有 BorderPane 的舞台。我还有另一个 class 和 public 静态方法,可以调用它们来设置菜单栏,例如:
public class MenuControl {
public static MenuBar menuBar;
public static Menu menuFile;
public static Menu menuGame;
public static Menu menuTools;
public static MenuItem save;
public static void initMenusMac() {
menuBar = new MenuBar();
Platform.runLater(() -> {
menuBar.useSystemMenuBarProperty().set(true);
});
menuFile = new Menu("File");
menuGame = new Menu("Game");
menuTools = new Menu("Tools");
save = new MenuItem("Save");
menuFile.getItems().add(save);
menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
GUI_Main.totalLay.setTop(menuBar);
}
public static void initMenus() {
menuBar = new MenuBar();
menuFile = new Menu("File");
menuGame = new Menu("Game");
menuTools = new Menu("Tools");
save = new MenuItem("Save");
menuFile.getItems().add(save);
menuBar.getMenus().addAll(menuFile, menuGame, menuTools);
GUI_Main.totalLay.setTop(menuBar);
}
}
我的最后一点是我无法更改它,因此主要方法在 SURPG_Mac 或 SURPG_Main 中,因为 Mac 集成存在不同的兼容性问题。
谁能帮我解决这个问题?
在此先感谢您!
看看这个项目:https://github.com/codecentric/NSMenuFX 它可以让你有一个更像 mac 的菜单栏。但是在使用它之前,您可能还必须清理有点奇怪的项目设置。