4

OS X 2013-004 (Java 1.6.0_51) 用の Java がいくつかの Swing アプリケーションを壊すようです: https://discussions.apple.com/message/22279872?tstart=0#22279872?tstart=0 mathworks.com/matlabcentral/answers/79489

アプリが読み込まれますが、正常に再描画されません。ボタンのクリックやその他の操作は実際に機能しているように見えますが、フレームのサイズが変更された場合にのみ表示が更新されます - 本当に奇妙です.

何が問題なのか誰にもわかりませんか?

編集: Apple が修正したようです: http://lists.apple.com/archives/java-dev/2013/Jun/msg00055.html

4

3 に答える 3

3

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");
    }
}
  1. 004 アップデートに付属する Apple JRE で実行します (例: at /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home)。メッセージが表示されていないこと、ダイアログ アイコンが表示されていないこと、およびボタンが目に見えてクリックできないことを確認します。

  2. 古い 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();
                }
            }
        });
    }
}
于 2013-06-20T07:23:30.403 に答える
2

この問題は、Apple がこれらのアップデートの改訂版をリリースすることで解決さ まし 。それだけ)

于 2013-06-21T20:02:35.260 に答える