This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit d1d7f13f1f85f86b8d82e9a761f85a77d6a808ee Author: Andrus Adamchik <[email protected]> AuthorDate: Tue May 19 19:04:15 2026 -0400 A more robust "universal" Main on mac --- .../java/org/apache/cayenne/modeler/Application.java | 20 ++++++++++++-------- .../cayenne/modeler/platform/UIInitializer.java | 10 +++++----- .../platform/generic/GenericUIInitializer.java | 2 +- .../modeler/platform/mac/MacUIInitializer.java | 11 +++++++---- .../modeler/platform/win/WinUIInitializer.java | 2 +- .../org/apache/cayenne/modeler/ui/MainFrame.java | 2 -- 6 files changed, 26 insertions(+), 21 deletions(-) diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java index 5bbeeff2e..d68690917 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java @@ -64,7 +64,9 @@ public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); - public static void launch(String[] args, UIInitializer platformInitializer) { + public static void launch(String[] args, UIInitializer platformInit) { + + platformInit.beforeSwingLaunch(); CliArgs cli = CliArgs.parse(args); @@ -80,11 +82,11 @@ public class Application { new ModelerModule()); SwingUtilities.invokeLater(() -> - new Application(injector, platformInitializer, cli).launch(cli.initialProject())); + new Application(injector, platformInit, cli).launch(cli.initialProject())); } private final Injector injector; - private final UIInitializer platformInitializer; + private final UIInitializer platformInit; private final ModelerClassLoader classLoader; private final PreferencesRepository preferencesRepository; private final ProjectValidator projectValidator; @@ -95,9 +97,9 @@ public class Application { private CayenneUndoManager undoManager; private DBConnectors dbConnectors; - public Application(Injector injector, UIInitializer platformInitializer, CliArgs cli) { + public Application(Injector injector, UIInitializer platformInit, CliArgs cli) { this.injector = injector; - this.platformInitializer = platformInitializer; + this.platformInit = platformInit; this.cli = cli; this.classLoader = new ModelerClassLoader(); @@ -134,8 +136,8 @@ public class Application { return injector.getInstance(UpgradeService.class); } - public UIInitializer getPlatformInitializer() { - return platformInitializer; + public UIInitializer getPlatformInit() { + return platformInit; } public ConfigurationNodeParentGetter getConfigurationNodeParentGetter() { @@ -171,7 +173,7 @@ public class Application { } public void launch(File initialProject) { - this.platformInitializer.initLookAndFeel(); + this.actionManager = new GlobalActions( this, injector.getInstance(ConfigurationNameMapper.class), @@ -197,6 +199,8 @@ public class Application { this.undoManager = new CayenneUndoManager(this); this.frame = new MainFrame(this); + this.platformInit.afterFrameCreated(this); + // open up frame.onStartup(); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java index 7c094416e..a544193e9 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java @@ -20,22 +20,22 @@ package org.apache.cayenne.modeler.platform; import org.apache.cayenne.modeler.Application; -import javax.swing.JFrame; - /** * A base callback for platform-specific Modeler initialization. */ public interface UIInitializer { /** - * Initializes application look and feel. + * Sets platform-specific system properties and initializes the application look and feel. + * Called before AWT/Swing is touched, so implementations may set properties that AWT reads + * only during its own init (e.g. {@code apple.awt.application.name}) before installing the L&F. */ - default void initLookAndFeel() { + default void beforeSwingLaunch() { } /** * Updates default frame menus according to the platform specifics. */ - default void setupMenus(Application app, JFrame frame) { + default void afterFrameCreated(Application app) { } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java index 496cee539..5fbf70ea7 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java @@ -39,7 +39,7 @@ public class GenericUIInitializer implements UIInitializer { private static final String DEFAULT_THEME_NAME = "Sky Bluer"; @Override - public void initLookAndFeel() { + public void beforeSwingLaunch() { PlasticTheme theme = findTheme(); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java index 637370458..09f272939 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java @@ -35,7 +35,10 @@ import java.util.Set; public class MacUIInitializer implements UIInitializer { @Override - public void initLookAndFeel() { + public void beforeSwingLaunch() { + // must be set before Aqua L&F initializes — it reads this property during init + System.setProperty("apple.awt.application.name", "CayenneModeler"); + // override some default styles and colors, assuming that Aqua theme will be used Color lightGrey = new Color(0xEEEEEE); @@ -89,10 +92,10 @@ public class MacUIInitializer implements UIInitializer { } @Override - public void setupMenus(Application app, JFrame frame) { + public void afterFrameCreated(Application app) { // set additional look and feel for the window - frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE); + app.getFrame().getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE); // Only relocate About/Preferences/Quit to the macOS application menu when the // screen menu bar is actually in use. Otherwise the JMenuBar stays inside the @@ -119,7 +122,7 @@ public class MacUIInitializer implements UIInitializer { removeActions.add(globalActions.getAction(AboutAction.class)); removeActions.add(globalActions.getAction(ConfigurePreferencesAction.class)); - JMenuBar menuBar = frame.getJMenuBar(); + JMenuBar menuBar = app.getFrame().getJMenuBar(); for (Component c : menuBar.getComponents()) { if (c instanceof JMenu menu) { diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java index 197a8013d..f06e33417 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java @@ -32,7 +32,7 @@ public class WinUIInitializer implements UIInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(WinUIInitializer.class); @Override - public void initLookAndFeel() { + public void beforeSwingLaunch() { try { UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // override some default styles and colors diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java index 402e74ec0..9e812c344 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java @@ -135,8 +135,6 @@ public class MainFrame extends AppFrame { setProjectView(null); - this.app.getPlatformInitializer().setupMenus(this.app, this); - this.session = new ProjectSession(this.app); this.session.addDirtyListener((wasDirty, isDirty) -> { if (isDirty) {
