2012-03-28 9 views
1

Ich versuche, einen JDialog zu erstellen, der dem Benutzer eine dynamische Nachricht auf einem JLabel anzeigt. Die Nachricht sollte eine Zahl von 1 bis 10 sein (und sie sollte jede Sekunde eine Zahl ändern). die Sache ist, wenn es im Debuggen ist - es stoppt direkt nach dem "dia.setVisible (true);" und wird nicht fortfahren, wenn ich den JDialog nicht schließe. Gibt es eine Möglichkeit, es zu reparieren? Danke.Dynamischen JLabel-Text in einem JDialog nach Timer setzen

Werfen Sie einen Blick auf den Code:

@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(); 
     } 
    } 

} 

Antwort

3
  • verwenden Thread.sleep(int) nicht für Swing-GUI, verursacht Einfrieren von, bis Thread.sleep(int)

    beendet
  • Verwendung Swing Timer statt Sperren Swing-GUI durch Verwendung von Thread.sleep(int)

  • nicht dia.setSize(300, 150) verwenden, lernen wie LayoutManager funktioniert

2

setVisible ist ein blockierender Aufruf auf JDialog Jahren. Du solltest einen anderen Thread starten und einen Runnable an ihn übergeben. Die Runnable.run() Methode sollte Ihre Schleife enthalten.

+0

SwingWorker ist definitiv eine bessere Alternative. Ich sollte versuchen, diese API ein für alle Mal zu lernen (nun, ich weiß es, aber ich habe es nie benutzt, also bin ich mir nie zu sicher) –

0

stellen Sie sicher, jl ist definiert als 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

Werfen Sie einen Blick auf diesem Code Beispiel, dass der richtige Weg ist, mit Hilfe von javax.swing.Timer Tutorials dynamischen Text zu verwenden, anstatt mit Thread.sleep(...) Dingen,

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(); 
      } 
     }); 
    } 
}