OSDN Git Service

OSXのスクリーンメニュー表示タイミングの修正
authorseraphy <seraphy@users.osdn.me>
Fri, 28 Dec 2018 10:42:19 +0000 (19:42 +0900)
committerseraphy <seraphy@users.osdn.me>
Fri, 28 Dec 2018 10:42:19 +0000 (19:42 +0900)
src/main/java/charactermanaj/Main.java
src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java
src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java

index e8fe219..52a0663 100644 (file)
@@ -339,9 +339,17 @@ public final class Main implements Runnable {
                                                // OSXでJava9以降であればOracle実装でDockIconを設定する.
                                                MainFramePartialForMacOSX9.setupDockIcon();
 
+                                               // スクリーンメニュー類を設定する.
+                                               // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される)
+                                               MainFramePartialForMacOSX9.setupScreenMenu();
+
                                        } else {
                                                // Java9未満であればeawtでDockIcon類を設定する.
                                                MainFramePartialForMacOSX.setupDockIcon();
+
+                                               // スクリーンメニューからのイベントをハンドルできるようにする.
+                                               // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される)
+                                               MainFramePartialForMacOSX.setupScreenMenu();
                                        }
 
                                } catch (Throwable ex) {
@@ -366,22 +374,6 @@ public final class Main implements Runnable {
                        // デフォルトのプロファイルを開く.
                        // (最後に使ったプロファイルがあれば、それが開かれる.)
                        final MainFrame mainFrame = ProfileListManager.openDefaultProfile();
-                       if (isMacOSX()) {
-                               try {
-                                       if (JavaVersionUtils.getJavaVersion() >= 9) {
-                                               // OSXでJava9以降であればOracle実装でスクリーンメニュー類を設定する.
-                                               MainFramePartialForMacOSX9.setupScreenMenu(mainFrame);
-
-                                       } else {
-                                               // Java9未満であればeawtでスクリーンメニュー類を設定する.
-                                               // MacOSXであればスクリーンメニューからのイベントをハンドルできるようにする.
-                                               MainFramePartialForMacOSX.setupScreenMenu(mainFrame);
-                                       }
-
-                               } catch (Throwable ex) {
-                                       logger.log(Level.CONFIG, "Failed to setup the screen menu.", ex);
-                               }
-                       }
 
                        // 表示(および位置あわせ)
                        mainFrame.showMainFrame();
index 1639bb4..6579535 100644 (file)
@@ -30,11 +30,34 @@ public class MainFramePartialForMacOSX {
                super();
        }
 
-       public static void setupScreenMenu(final MainFrame mainFrame) {
-               if (mainFrame == null) {
-                       throw new IllegalArgumentException();
+       /**
+        * DockIconを設定する
+        */
+       public static void setupDockIcon() {
+               try {
+                       Application app = Application.getApplication();
+                       Class<?> clz = app.getClass();
+
+                       BufferedImage icon = UIHelper.getInstance().getImage("icons/icon.png");
+
+                       Method mtd = clz.getMethod("setDockIconImage", new Class[] {Image.class});
+                       mtd.invoke(app, new Object[] { icon });
+
+               } catch (NoSuchMethodException ex) {
+                       // メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い.
+                       logger.log(Level.CONFIG, "dockIcon not supported.", ex);
+
+               } catch (Exception ex) {
+                       // 実行時の失敗だが、DockIconが設定できないだけなので継続する.
+                       logger.log(Level.WARNING, "dockIcon failed.", ex);
                }
+       }
 
+       /**
+        * スクリーンメニューを設定する
+        * @param mainFrame
+        */
+       public static void setupScreenMenu() {
                Application app = Application.getApplication();
 
                app.setEnabledAboutMenu(true);
@@ -64,24 +87,4 @@ public class MainFramePartialForMacOSX {
                };
                app.addApplicationListener(listener);
        }
-
-       public static void setupDockIcon() {
-               try {
-                       Application app = Application.getApplication();
-                       Class<?> clz = app.getClass();
-
-                       BufferedImage icon = UIHelper.getInstance().getImage("icons/icon.png");
-
-                       Method mtd = clz.getMethod("setDockIconImage", new Class[] {Image.class});
-                       mtd.invoke(app, new Object[] { icon });
-
-               } catch (NoSuchMethodException ex) {
-                       // メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い.
-                       logger.log(Level.CONFIG, "dockIcon not supported.", ex);
-
-               } catch (Exception ex) {
-                       // 実行時の失敗だが、DockIconが設定できないだけなので継続する.
-                       logger.log(Level.WARNING, "dockIcon failed.", ex);
-               }
-       }
 }
index b14f2ad..8573020 100644 (file)
@@ -29,6 +29,11 @@ public class MainFramePartialForMacOSX9 {
                super();
        }
 
+       /**
+        * DockIconを設定する
+        *
+        * @throws Exception 失敗した場合
+        */
        public static void setupDockIcon() throws Exception {
                Class<?> taskbarCls = Class.forName("java.awt.Taskbar");
                Object taskbar = taskbarCls.getMethod("getTaskbar").invoke(null);
@@ -36,7 +41,14 @@ public class MainFramePartialForMacOSX9 {
                Image icon = ImageIO.read(Main.class.getResource("/icons/icon.png"));
                setIconImageMethod.invoke(taskbar, icon);
        }
-       public static void setupScreenMenu(final MainFrame mainFrame) throws Exception {
+
+       /**
+        * スクリーンメニューを設定する
+        *
+        * @param mainFrame メインフレーム
+        * @throws Exception 失敗
+        */
+       public static void setupScreenMenu() throws Exception {
                // Java9以降であればOracle実装でスクリーンメニュー類を設定する.
                // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている)