API addition proposal -- Add Action enum and methods to javafx.application.Application

David Kopp codebangusllc at gmail.com
Wed Oct 23 11:01:29 UTC 2024


Michael, would you be willing to create an issue in the JavaFX issue tracker so I could start working on this?

Have a blessed day,



David Kopp

> On Oct 14, 2024, at 7:29 PM, David Kopp <codebangusllc at gmail.com> wrote:
> 
> I have looked into the Desktop API implementation in the JDK. They have their own code to manipulate the Application menu, so I don’t think it will be possible to get the About and Settings menu items to show up via the Desktop API. I tried the code you had posted in your last email, but the menu items remain absent.
> 
> I did try out the other Desktop methods in a little JavaFX test app. Calling them via SwingUtilities.invokeLater works just fine.
> 
> So, I think we will need a new, small API in order for JavaFX macOS applications to be able to integrate into the system like Swing apps can.
> 
> I currently have:
> 
> Added to ConditionalFeature
> 
>    /**
>     * Indicates whether or not the platform supports an OS application menu About item.
>     * <p>
>     * Currently, only MacOS support this feature.
>     * @since JavaFX 24.0
>     */
>    ABOUT,
> 
>    /**
>     * Indicates whether or not the platform supports an OS application menu Settings item.
>     * <p>
>     * Currently, only MacOS support this feature.
>     * @since JavaFX 24.0
>     */
>    SETTINGS
> 
> 
> javafx.application.Application
> 
> 
>    /**
>     * Installs a handler to show a custom about window for your application.
>     * <p>
>     * Setting the handler to null reverts it to the default behavior. This is a no-op on
>     * platforms that do not support javafx.application.ConditionalFeature.ABOUT
>     *
>     * @param handler the handler
>     *
>     * @since JavaFX 24.0
>     */
>    public void setAboutHandler(Runnable handler) {
>        PlatformImpl.setAboutHandler(handler);
>    }
> 
>    /**
>     * Installs a handler to show a custom settings window for your application.
>     * <p>
>     * Setting the handler to null reverts it to the default behavior. This is a no-op on
>     * platforms that do not support javafx.application.ConditionalFeature.SETTINGS
>     *
>     * @param handler the handler
>     *
>     * @since JavaFX 24.0
>     */
>    public void setSettingsHandler(Runnable handler) {
>        PlatformImpl.setSettingsHandler(handler);
>    }
> 
> PlatformImpl.java
> 
>    /**
>     * Installs a handler to show a custom about window for your application. This is a no-op on
>     * platforms that do not support this feature.
>     *
>     * @since JavaFX 24
>     */
>    public static void setAboutHandler(Runnable handler) {
>        com.sun.glass.ui.Application.GetApplication().setAboutHandler(handler);
>    }
> 
>    /**
>     * Installs a handler to show a custom settings window for your application. This is a no-op on
>     * platforms that do not support this feature.
>     *
>     * @since JavaFX 24
>     */
>    public static void setSettingsHandler(Runnable handler) {
>        com.sun.glass.ui.Application.GetApplication().setSettingsHandler(handler);
>    }
> 
> 
> com.sun.class.ui.Application
> 
>    /**
>     * Installs a handler to show a custom About window for your application. This default
>     * implementation is a no-op.
>     */
>    public void setAboutHandler(Runnable handler) {
>    }
> 
>    /**
>     * Installs a handler to show a custom Settings window for your application. This default
>     * implementation is a no-op.
>     */
>    public void setSettingsHandler(Runnable handler) {
>    }
> 
> 
> MacApplication
> 
>    private Runnable aboutHandler;
>    private Runnable settingsHandler;
> 
>    @Override
>    public void setAboutHandler(Runnable handler) {
>        aboutHandler = handler;
>        rebuildAppleMenu();
>    }
> 
>    @Override
>    public void setSettingsHandler(Runnable handler) {
>        settingsHandler = handler;
>        rebuildAppleMenu();
>    }
> 
>    private void rebuildAppleMenu() {
>        for (int index = this.appleMenu.getItems().size() - 1; index >= 0; index--) {
>            this.appleMenu.remove(index);
>        }
> 
>        if (null != aboutHandler) {
>            MenuItem aboutMenu = createMenuItem("About " + getName(), new MenuItem.Callback() {
>                @Override public void action() {
>                    aboutHandler.run();
>                }
>                @Override public void validate() {
>                }
>            });
>            this.appleMenu.add(aboutMenu);
>            this.appleMenu.add(MenuItem.Separator);
>        }
> 
>        if (null != settingsHandler) {
>            MenuItem preferencesMenu = createMenuItem("Settings...", new MenuItem.Callback() {
>                @Override public void action() {
>                  settingsHandler.run();
>                }
>                @Override public void validate() {
>                }
>            }, ',', KeyEvent.MODIFIER_COMMAND);
>            this.appleMenu.add(preferencesMenu);
>            this.appleMenu.add(MenuItem.Separator);
>        }
> 
>        MenuItem hideMenu = createMenuItem("Hide " + getName(), new MenuItem.Callback() {
>            @Override public void action() {
>                MacApplication.this._hide();
>            }
>            @Override public void validate() {
>            }
>        }, 'h', KeyEvent.MODIFIER_COMMAND);
>        this.appleMenu.add(hideMenu);
> 
>        MenuItem hideOthersMenu = createMenuItem("Hide Others", new MenuItem.Callback() {
>            @Override public void action() {
>                MacApplication.this._hideOtherApplications();
>            }
>            @Override public void validate() {
>            }
>        }, 'h', KeyEvent.MODIFIER_COMMAND | KeyEvent.MODIFIER_ALT);
>        this.appleMenu.add(hideOthersMenu);
> 
>        MenuItem unhideAllMenu = createMenuItem("Show All", new MenuItem.Callback() {
>            @Override public void action() {
>                MacApplication.this._unhideAllApplications();
>            }
>            @Override public void validate() {
>            }
>        });
>        this.appleMenu.add(unhideAllMenu);
> 
>        this.appleMenu.add(MenuItem.Separator);
> 
>        MenuItem quitMenu = createMenuItem("Quit " + getName(), new MenuItem.Callback() {
>            @Override public void action() {
>                Application.EventHandler eh = getEventHandler();
>                if (eh != null) {
>                    eh.handleQuitAction(Application.GetApplication(), System.nanoTime());
>                }
>            }
>            @Override public void validate() {
>            }
>        }, 'q', KeyEvent.MODIFIER_COMMAND);
>        this.appleMenu.add(quitMenu);
>    }
> 
>    public void installAppleMenu(MenuBar menubar) {
>        this.appleMenu = createMenu("Apple");
> 
>        rebuildAppleMenu();
> 
>        menubar.add(this.appleMenu);
>    }
> 



More information about the openjfx-dev mailing list