2012-03-28 8 views
1

JLabel上に動的メッセージを表示するJDialogを作成しようとしています。 メッセージは1から10までのカウントでなければなりません(1秒ごとに数値を変更する必要があります)。 問題は、デバッグするときに、「dia.setVisible(true);」の直後に停止します。私がJDialogを閉じるまで、進まないでしょう。 これを固定する方法はありますか?おかげさまで JDialogのダイナミックJLabelテキストをタイマで設定します。

コードを見てみましょう:

@Override 
public void run() { 

    dia = new JDialog(parentDialog, true); 
    dia.setLocationRelativeTo(parentFrame); 


    String text = "Text "; 
    dia.setSize(300, 150); 
    jl = new JLabel(text); 
    dia.getContentPane().add(jl); 
    dia.setVisible(true); 
    for (int i = 0; i < 10; i++) { 
     try { 
      Thread.sleep(1000); 
      jl.setText(text + " " + i); 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

答えて

3
  • のSwing GUIのためのThread.sleep(int)を使用していないが、それまではThread.sleep(int)の凍結ではなくThread.sleep(int)

  • の使用により、SwingのGUIをロックする

  • 使用Swing Timer学び、dia.setSize(300, 150)を使用していないに終了した原因how LayoutManager作品

2

setVisibleはJDialogの上のブロッキング呼び出しです。他のスレッドを開始してRunnableを渡す必要があります。 Runnable.run()メソッドにループが含まれている必要があります。

+0

javax.swing.Timer Tutorialsの助けを借りて、ダイナミックテキストを使用する適切な方法ですSwingWorkerは確実に良い選択肢です。私はそのAPIを一度だけ学んでみるべきです(私はそれを知っていますが、私は決して使っていませんので、 –

0

jlfinalのように定義されていることを確認します

... 
dia.getContentPane().add(jl); 

new Thread(new Runnable() { 
    for (int i = 0; i < 10; i++) { 
     try { 
      Thread.sleep(1000); 
      jl.setText(text + " " + i); 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}).run(); 

dia.setVisible(true); 
2

は、このコードの例を見てください、それは、代わりにThread.sleep(...)ブツを使用しての、

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class DialogExample extends JDialog 
{ 
    private Timer timer; 
    private JLabel changingLabel; 
    private int count = 0; 
    private String initialText = "TEXT"; 

    private ActionListener timerAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      count++; 
      if (count == 10) 
       timer.stop(); 
      changingLabel.setText(initialText + count); 
     } 
    }; 

    private void createDialog() 
    { 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 
     changingLabel = new JLabel(initialText); 
     contentPane.add(changingLabel); 

     add(contentPane); 

     pack(); 
     setVisible(true); 
     timer = new Timer(1000, timerAction); 
     timer.start(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new DialogExample().createDialog(); 
      } 
     }); 
    } 
} 
関連する問題