2016-05-21 15 views
2

私のモーダルJDialogに少し問題があります。コードがバックグラウンドで実行されている間に(ファイルをダウンロードする)、ダイアログを更新して、ユーザーが現在の状態を確認できるようにしたい。そのダウンロードは正常ですが、ダイアログを更新していません...助けてください!私は間違いを見つけることができません。 :モーダルJDialogが更新されない

コードスニペットC:

JDialog dialog = new JDialog(parentFrame, "Element download...", true); 
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
dialog.setResizable(false); 
dialog.getContentPane().setLayout(new BorderLayout()); 

JPanel panel = new JPanel(); 
panel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
panel.setPreferredSize(new Dimension(300, 100)); 
panel.setLayout(null); 
dialog.add(panel); 

final JLabel label = new JLabel("Starting download..."); 
label.setBounds(new Rectangle(0, 0, 300, 20)); 
label.setHorizontalTextPosition(JLabel.CENTER); 
panel.add(label); 

final JProgressBar bar = new JProgressBar(0, 118); 
bar.setBounds(new Rectangle(20, 0, 300, 80)); 
panel.add(bar); 

dialog.pack(); 
dialog.setLocationRelativeTo(parentFrame); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       // Executin some code (that works fine) 
       bar.setValue(value); 
       label.setText(text); 
       System.out.println(text); 
       dialog.dispose(); 
      } 
     }); 
    } 
}).start(); 
dialog.setVisible(true); 
+0

ファイルをダウンロードするコードはどこですか?スレッド内のすべてのコードは、Event Dispatchスレッドで実行されます。また、スレッドを開始する前にJDialogを表示する必要があります。 –

+0

なぜコードが必要でしょうか?私は非常に長いので、私はそれを切った。スレッドを実行する前にJDialogを表示するように設定すると、JDialogが他のアクションをブロックしているため、ダイアログが閉じるまでスレッドは実行されません。 – Nicolas

答えて

1

あなたがスレッドを使用していて、SwingUtilities.invokeLaterを()が誤って。

スレッドのポイントは、別のスレッドで長い実行中のタスク(ファイルのダウンロード)を実行して、Event Dispatch Thread (EDT)をブロックしないことです。

SwingUtilities.invokeLater()のポイントは、EDTにコードを追加することです。

あなたの場合、EDTにファイルダウンロードコードを追加しています。つまり、GUIはイベントに応答できないか、すべてのファイルのダウンロードが完了するまで再描画できません。

ダウンロードするコードをスレッドで実行し、各ファイルのダウンロードが完了すると、バーとラベルを更新するSwingUtilities.invokeLater(...)を作成します。

これを行う最も簡単な方法は、SwingWorkerpublish()の結果を利用できるようにすることです。

SwingWorkerの詳細と動作例については、ConcurrencyのSwingチュートリアルのセクションを参照してください。

+0

ありがとうございます! – Nicolas

関連する問題