2013-06-21 の更新: この回答には役立つ可能性のあるいくつかの回避策と代替手段が含まれていますが、@ sidney-markowitz-biomatters の回答には正しいコード修正が含まれています - LAF はイベントスレッドから設定する必要があります!
最近の問題は、Mac OS X の Swing アプリのデフォルトである Aqua ルック アンド フィール (LAF) を壊すアップデートに関連しているようです。
Aqua LAF が必要な場合、選択肢はそれほど多くありません。Apple からの次の Java アップデートを待つ必要があるかもしれません (Apple 自身の LAF であることを考えると、Apple はこれを優先して修正すると思います)。また、 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 オプションでも機能します) (例: at My.app/Contents/Info.plist
)。
の値の末尾に追加-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
します。オプションは、端末と同じようにスペースで区切られています。たとえば、すでにオプションがある場合:<string>
VMOptions
<key>
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 アップデートに付属する Apple JRE で実行します (例: at /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
)。メッセージが表示されていないこと、ダイアログ アイコンが表示されていないこと、およびボタンが目に見えてクリックできないことを確認します。
古い Apple JRE または別の 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();
}
}
});
}
}