2012-03-28 2 views
1

Im пытается сделать JDialog, который покажет пользователю динамическое сообщение на JLabel. Сообщение должно быть числом от 1 до 10 (и оно должно меняться число раз в секунду). вещь, когда im отлаживает ее - она ​​останавливается сразу после «dia.setVisible (true)»; , и не будет продолжаться, если я не закрою JDialog. Есть ли какой-либо возможный способ его крепления? Спасибо.Установить динамический JLabel текст в JDialog по таймеру

Взгляните на код:

@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
  • не используют Thread.sleep(int) для графического интерфейса Swing, вызвало замораживание недо Thread.sleep(int) закончился

  • использовать Swing Timer вместо блокировки графического интерфейса Swing путем использования Thread.sleep(int)

  • не используют dia.setSize(300, 150), узнать как LayoutManager работы

2

setVisible является блокировка вызова на JDialog х. Вы должны начать другую тему и передать ей Runnable. Метод Runnable.run() должен содержать ваш цикл.

+0

согласованный SwingWorker определенно является лучшей альтернативой. Я должен попытаться узнать этот API раз и навсегда (ну, я знаю это, но я никогда не использовал его, поэтому я никогда не был слишком уверен) –

0

убедитесь, что jl определяется как final:

... 
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

Посмотрите на этом примере кода, что это правильный способ использовать динамический текст с помощью javax.swing.Timer Tutorials, вместо того, чтобы использовать 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(); 
      } 
     }); 
    } 
}