更新2013-06-21:この回答には役立つ可能性のあるいくつかの回避策と代替案が含まれていますが、@sidney-markowitz-biomattersの回答には正しいコード修正が含まれています-LAFはイベントスレッドから設定する必要があります!
最近の問題は、MacOSXのSwingアプリのデフォルトであるAquaLookand Feel(LAF)を壊すアップデートに関連しているようです。
Aqua LAFが必要な場合は、あまり多くのオプションはありません。 Appleからの次のJavaアップデートを待つ必要があるかもしれません(それが彼ら自身のLAFであることを考えると、彼らはこれを優先的に修正すると思います)。 Java Application Bundlerを使用することもできます(つまり、Oracle JREをバンドルし、システムのJREの使用を避けます)。
別のLAFでうまくいくことができれば、アプリは通常どおり動作するはずです。少なくともPaperCutの場合はそうでした(003の更新によりウィンドウフォーカスの問題が発生し、004の更新により騒乱が発生しました)。
いくつかのオプション:
-
Javaコード(NimbusやMetalなど)からのJavaバージョン固有のクロスプラットフォームLAFの使用:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
-
Javaコードから特定のLAFを設定する:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
-
ターミナルからのデフォルトのLAFのオーバーライド:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
この例では、 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
を明示的に呼び出していました。 コード内で、コードの変更を伴わない回避策(つまり、修正プログラム)が必要だったため、デフォルトのシステムをオーバーライドする必要がありました。 LAFは次のとおりです。
-
端末からのシステムLAFのオーバーライド:
java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
-
Info.plist
からシステムLAFをオーバーライドする ファイル (Macアプリケーションとしてバンドルしている場合は、他のVMオプションでも機能します)(例:My.app/Contents/Info.plist
。-Dswing.systemlaf =javax.swing.plaf.nimbus.NimbusLookAndFeel
を追加します 終わりへVMOptions
の値<キー>コード> 。オプションは、ターミナルと同じようにスペースで区切られています。例えば。すでに
useScreenMenuBar
をお持ちの場合 オプション:<key>VMOptions</key> <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
編集:@trashgodは再現可能な例を求めました。 004アップデートの問題の全範囲が何であるかはわかりませんが、ここに簡単な再現があります:
更新2013-06-21-間違った方法で、エラーを再現します:
public class AquaLafTest {
public static void main(String[] args) throws Exception {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
javax.swing.JOptionPane.showMessageDialog(null, "msg");
}
}
-
004アップデートに付属するAppleJREで実行します(例:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
)。メッセージが表示されていないこと、ダイアログアイコンが表示されていないこと、ボタンが目に見えてクリックできないことを確認してください。 -
古いAppleJREまたは別のJREで実行します。ダイアログが期待どおりに表示されることを確認します。
更新2013-06-21-イベントスレッドでの正しい方法は正しく機能します:
public class AquaLafTest {
public static void main(String[] args) throws Exception {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
javax.swing.JOptionPane.showMessageDialog(null, "msg");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}