2017-06-21 1 views
1

Ich möchte den Jlabel-Text jede Sekunde aktualisieren, solange die Schleife läuft. Wie könnte ich das tun? Ich möchte so etwas tun.Aktualisieren Sie den Jlabel-Text durch eine Schleife in Java Swing?

JPanel jpnl=new JPanel(); 
    jfrm.add(jpnl); 
    String[] fonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); 
    jlab = new JLabel("This is Label"); 
    jpnl.add(jlab); 

     for(int i=0;i<fonts.length;i++){ 
      System.out.println(fonts[i]); 
      jlab.setText(fonts[i]); 
      jlab.setFont(new Font(fonts[i],Font.PLAIN,30)); 
      jlab.setForeground(Color.DARK_GRAY); 
     } 
+0

Wenn nur Zeit ist ein Thema, und Sie haben keine anderen Anforderungen festgelegt, können Sie einfach Thread.sleep (1000) in der Schleife verwenden – Nenad

+0

Können Sie erklären, einfacher Thread.sleep (1000) innerhalb der Schleife wird nicht funktionieren. –

+1

Erstens, verwenden Sie nicht 'Thread.sleep', es wird einfach dazu führen, dass die Schleife länger dauert und blockiert die UI von aktualisiert worden. Die konische Antwort ist, einen Swing 'Timer' zu verwenden – MadProgrammer

Antwort

6

Swing single threaded Natur verbiete mit einer Schleife oder Thread.sleep in der Art und Weise Sie scheinen versucht zu werden. Dadurch wird die Benutzeroberfläche einfach blockiert und verhindert, dass sie bis zum Abschluss der Schleife aktualisiert wird.

Da Swing nicht Thread-sicher, können Sie einfach nicht verwenden eine andere Thread und die oben genannten Ansätze, um die Benutzeroberfläche zu aktualisieren, ohne durch einige Reifen zu springen

Die konische Antwort auf Ihre Frage ist eine Swing-Timer zu verwenden, was zu einer regelmäßigen Basis ein Update auslöst. Da diese Updates im Zusammenhang mit dem Ereignis-Dispatching-Thread ausgelöst werden, ist es sicher, wenn Sie die Benutzeroberfläche aktualisieren möchten.

Werfen Sie einen genaueren Blick auf How to use Swing Timers um weitere Informationen zu

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GraphicsEnvironment; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private String[] fonts; 
     private final JLabel jlab; 
     private int index = 0; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); 
      jlab = new JLabel("This is Label"); 
      add(jlab); 

      Timer timer = new Timer(1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        updateFont(); 
        index++; 
        if (index >= fonts.length) { 
         ((Timer)e.getSource()).stop(); 
        } 
       } 
      }); 
      timer.setInitialDelay(0); 
      timer.start(); 
     } 

     protected void updateFont() { 
      System.out.println(fonts[index]); 
      jlab.setText(fonts[index]); 
      jlab.setFont(new Font(fonts[index], Font.PLAIN, 30)); 
      jlab.setForeground(Color.DARK_GRAY);   
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

}