3

データベースから初期データを取得するのに5〜10秒かかるアプリケーションを起動する適切な方法は何ですか?これは私が今までに得たものですが、より良い方法はないとは確信していません。私は、GUIの構築とデータの取得を同時に行うように、GUIとデータベースのアクセスを別のスレッドにすることをお勧めします。Java Swingデスクトップアプリケーションを正しく起動する方法

public static void main(String[] args) { 
    final Controller controller = new Controller(); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      View frame = new View(); 
      controller.setView(frame); 
     } 
    }); 
    Model model = new Model(); 
    controller.setModel(model); 
    controller.getInitialData(); 
} 
+3

私は問題の内容を理解していません。データベースのアクセスが完了したときにモデルの変更に対応できるように、GUIを設計する必要があります。 'JTable'が' TableModel'からのイベントをリスンするのと同じように、全体のUIはモデルからのイベント(「DBアクセス完了」など)をリッスンする必要があります。 – Darien

+3

GUIが表示される前に、データのロード中に[スプラッシュ画面](http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/splashscreen/)を表示できます。それ以外の場合は、GUIを起動してフリーズし、データがロードされている間にメッセージを表示することもできます。 – toto2

+2

はい、間違いなくデータベースは別のスレッドで動作します。私はあなたのgetInitialDataメソッド本体がSwingWorkerを作成し、SwingWorkerの内部からデータそのものを取得し、上記のコメントで述べたように、このアクションが完了したときにGUIに通知すると思います。 –

答えて

8

あなたは正しいトラックに並んでいます。うまくいけば、これは物事をもう少し明確にするでしょう...

スイングはスレッドセーフではありません。あなたにできることはいくつかあります。 1つの方法は、SwingUtilitiesを使用して、実行されるイベントディスパッチスレッドにRunnableタスクを投稿することです。これにより、Swingのシングルスレッドモデルを尊重しながら、データベースからデータを取得し、別のスレッドでUIを更新することができます。

SwingUtilities.invokeLater(new Runnable(){ 
    @Override 
    public void run(){ 
     // update UI 
    } 
}); 

別のオプション、これは長時間実行中のタスクであるためには、UI行われ、または処理している間のいずれかに更新を提供するためにSwingWorkerを使用することです。

あなたが見ることができるように、EventQueueのために、これらのメカニズム(すなわちSwingUtilitiesSwingWorker)(通常アクションに変換)結果を配置する機能をご提供しながら、他のスレッドに、このようなタスクを捧げることができます両方の後で(そして安全に)実行されます。どちらを選択するかに関わらず、長時間実行するタスクは決してEDTで行われるべきではないことを覚えておくことが重要です。したがって、私が発見したように、うまく設計されたGUIの最も重要な機能は、応答性です。

関連する問題