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) {

Reply via email to