作成 2010.01.05
更新 2010.01.05
javax.swingの警告について
「このクラスの直列化されたオブジェクトは、今後の Swing リリースと互換ではなくなる予定です。」

1.2の頃からずっとマニュアルに記述されている以下の警告に関する解説。

警告: このクラスの直列化されたオブジェクトは、今後の Swing リリースと互換ではなくなる予定です。現在の直列化のサポートは、短期間の運用や、同じバージョンの Swing を実行するアプリケーション間の RMI に適しています。JDK Version 1.4 以降、すべての JavaBeans の長期間の運用サポートは、java.beans パッケージに追加されています。詳細は、XMLEncoder を参照してください。
「直列化されたオブジェクト」とは

直列化(シリアライズ:serialize)とは、ソフトウェアの内部データをまるごと保存したり、送信したりできるように並べることです。Java の場合は、ObjectOutputStream、ObjectInputStreamを使用してオブジェクトそのものをファイルに保存して読み出したりネットワーク間でやり取りすることができます。「直列化されたオブジェクト」とは、ObjectOutputStream で出てきた生データのことです。

何が言いたいのか
  • バージョンが違うもの同士で ObjectOutputStream を使ってやり取りしないでください。互換性が無くなる予定です。
  • オブジェクトのやりとりは、XMLEncoder を使ってください。こちらは長期サポートされます。
「Swing はスレッドに対して安全ではありません。」

なにかセキュリティ上の問題を抱えているようにも読めますが・・・

警告: Swing はスレッドに対して安全ではありません。詳細は、「Swing's Threading Policy」を参照してください。
「スレッドに対して安全ではありません」とは

マルチスレッド プログラムで、ある処理が応答不能になっても、他のスレッドの動作に影響が無いことを「スレッドに対して安全(スレッド セーフ)」と表現します。javax.swing のオブジェクトとそれを継承したオブジェクトは、描画処理や内部で処理を実行すると他の処理ができなくなります。

症例1:Javaアプリケーションを起動して画面表示をするのにすごく時間がかかる。
オブジェクトを一つ一つ順番にロードするからです。

症例2:javax.swing.JLabel を実行中のステータス表示に使おうとしても何も表示されず、実行終了時に表示される。 java.awt.Label では期待通り動作する。
本来はJProgressBarを使う。

何が言いたいのか
  • 初回起動が重いので SwingUtilities.invokeLater を使って描画の非同期実行をすると軽くなりますよ。
    ほとんど変わりません。むしろSSDを使った方がパフォーマンスは劇的に改善されます。
    public class MyApp implements Runnable {
      public void run() {
        // Invoked on the event dispatching thread.
        // Construct and show GUI.
      }
    
      public static void main (String [] args) {
        SwingUtilities.invokeLater(new MyApp(args));
      }
    }
    
    または
    public class MyApp {
      MyApp(String[] args) {
        // Invoked on the event dispatching thread.
        // Do any initialization here.
      }
    
      public void show() {
        // Show the UI.
      }
    
      public static void main(final String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            new MyApp(args).show();
          }
        });
      }
    }
    
タグ: Java

©2004-2017 UPKEN IPv4