OSDN Git Service

OSXの場合、DockIconを先に設定するように修正
authorseraphy <seraphy@users.osdn.me>
Thu, 27 Dec 2018 23:06:30 +0000 (08:06 +0900)
committerseraphy <seraphy@users.osdn.me>
Thu, 27 Dec 2018 23:06:30 +0000 (08:06 +0900)
src/main/java/charactermanaj/Main.java
src/main/java/charactermanaj/ui/MainFrame.java
src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java
src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java

index e04d348..e8fe219 100644 (file)
@@ -7,7 +7,6 @@ import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.lang.Thread.UncaughtExceptionHandler;
-import java.lang.reflect.Method;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Locale;
@@ -27,6 +26,7 @@ import charactermanaj.graphics.io.ImageCacheMBeanImpl;
 import charactermanaj.model.AppConfig;
 import charactermanaj.model.util.StartupSupport;
 import charactermanaj.ui.MainFrame;
+import charactermanaj.ui.MainFramePartialForMacOSX;
 import charactermanaj.ui.MainFramePartialForMacOSX9;
 import charactermanaj.ui.ProfileListManager;
 import charactermanaj.ui.SelectCharatersDirDialog;
@@ -332,6 +332,23 @@ public final class Main implements Runnable {
                                }
                        }
 
+                       // OSXであれば、DockIconを先に設定する
+                       if (isMacOSX()) {
+                               try {
+                                       if (JavaVersionUtils.getJavaVersion() >= 9) {
+                                               // OSXでJava9以降であればOracle実装でDockIconを設定する.
+                                               MainFramePartialForMacOSX9.setupDockIcon();
+
+                                       } else {
+                                               // Java9未満であればeawtでDockIcon類を設定する.
+                                               MainFramePartialForMacOSX.setupDockIcon();
+                                       }
+
+                               } catch (Throwable ex) {
+                                       logger.log(Level.CONFIG, "Failed to setup the dock icon.", ex);
+                               }
+                       }
+
                        if (currentCharacterDir == null) {
                                // キャラクターセットディレクトリの選択
                                File defaultCharacterDir = ConfigurationDirUtilities.getDefaultCharactersDir();
@@ -358,12 +375,7 @@ public final class Main implements Runnable {
                                        } else {
                                                // Java9未満であればeawtでスクリーンメニュー類を設定する.
                                                // MacOSXであればスクリーンメニューからのイベントをハンドルできるようにする.
-                                               // OSXにしか存在しないクラスを利用するためリフレクションとしている.
-                                               // ただしJDKによっては、Apple Java Extensionsがないことも予想されるので、
-                                               // その場合はエラーにしない。
-                                               Class<?> clz = Class.forName("charactermanaj.ui.MainFramePartialForMacOSX");
-                                               Method mtd = clz.getMethod("setupScreenMenu", MainFrame.class);
-                                               mtd.invoke(null, mainFrame);
+                                               MainFramePartialForMacOSX.setupScreenMenu(mainFrame);
                                        }
 
                                } catch (Throwable ex) {
index 4a2db81..adf3b26 100644 (file)
@@ -151,7 +151,7 @@ public class MainFrame extends JFrame
        /**
         * メインフレームのアイコン.<br>
         */
-       protected BufferedImage icon;
+       private BufferedImage icon;
 
 
        /**
index 604d183..1639bb4 100644 (file)
@@ -1,17 +1,18 @@
 package charactermanaj.ui;
 
 import java.awt.Image;
+import java.awt.image.BufferedImage;
 import java.lang.reflect.Method;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-
-import charactermanaj.util.SystemUtil;
-
 import com.apple.eawt.Application;
 import com.apple.eawt.ApplicationAdapter;
 import com.apple.eawt.ApplicationEvent;
 
+import charactermanaj.util.SystemUtil;
+import charactermanaj.util.UIHelper;
+
 /**
  * Mac OS X用のメインフレームサポートクラス.<br>
  * スクリーンメニューのハンドラなどを接続している.<br>
@@ -19,7 +20,7 @@ import com.apple.eawt.ApplicationEvent;
  *
  */
 public class MainFramePartialForMacOSX {
-       
+
        /**
         * ロガー
         */
@@ -33,9 +34,9 @@ public class MainFramePartialForMacOSX {
                if (mainFrame == null) {
                        throw new IllegalArgumentException();
                }
-               
+
                Application app = Application.getApplication();
-               
+
                app.setEnabledAboutMenu(true);
                app.setEnabledPreferencesMenu(true);
 
@@ -62,11 +63,17 @@ 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[] {mainFrame.icon});
+                       mtd.invoke(app, new Object[] { icon });
 
                } catch (NoSuchMethodException ex) {
                        // メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い.
@@ -77,5 +84,4 @@ public class MainFramePartialForMacOSX {
                        logger.log(Level.WARNING, "dockIcon failed.", ex);
                }
        }
-       
 }
index 02f2d11..b14f2ad 100644 (file)
@@ -29,15 +29,16 @@ public class MainFramePartialForMacOSX9 {
                super();
        }
 
-       public static void setupScreenMenu(final MainFrame mainFrame) throws Exception {
-               // Java9以降であればOracle実装でスクリーンメニュー類を設定する.
-               // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている)
-
+       public static void setupDockIcon() throws Exception {
                Class<?> taskbarCls = Class.forName("java.awt.Taskbar");
                Object taskbar = taskbarCls.getMethod("getTaskbar").invoke(null);
                Method setIconImageMethod = taskbarCls.getMethod("setIconImage", Image.class);
                Image icon = ImageIO.read(Main.class.getResource("/icons/icon.png"));
                setIconImageMethod.invoke(taskbar, icon);
+       }
+       public static void setupScreenMenu(final MainFrame mainFrame) throws Exception {
+               // Java9以降であればOracle実装でスクリーンメニュー類を設定する.
+               // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている)
 
                Desktop desktop = Desktop.getDesktop();
                Class<?> aboutHandlerCls = Class.forName("java.awt.desktop.AboutHandler");