From: seraphy Date: Fri, 28 Dec 2018 10:42:19 +0000 (+0900) Subject: OSXのスクリーンメニュー表示タイミングの修正 X-Git-Url: http://git.sourceforge.jp/view?p=charactermanaj%2FCharacterManaJ.git;a=commitdiff_plain;h=0c2d6bcd783a0d2ad42e3616e0a09567a00f5d08 OSXのスクリーンメニュー表示タイミングの修正 --- diff --git a/src/main/java/charactermanaj/Main.java b/src/main/java/charactermanaj/Main.java index e8fe219..52a0663 100644 --- a/src/main/java/charactermanaj/Main.java +++ b/src/main/java/charactermanaj/Main.java @@ -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(); diff --git a/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java b/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java index 1639bb4..6579535 100644 --- a/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java +++ b/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java @@ -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); - } - } } diff --git a/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java b/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java index b14f2ad..8573020 100644 --- a/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java +++ b/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java @@ -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でハンドラを作っている)