2012-11-13 3 views
0

J'essaye d'écrire une applet Java qui affichera une chaîne entrée par l'utilisateur, il devrait alors flasher la chaîne en basculant entre cela et un autre. J'essaie d'utiliser un thread pour faire cela, mais je suis nouveau à ceux et Applets, je ne sais pas quoi faire à partir de maintenant.Clignotant chaînes avec threads

voici ce que j'ai jusqu'à présent:

public class FlashingLabel extends JApplet implements Runnable 
{ 
String blank; 
String input; 
JLabel label; 
Thread t; 



public void init() 
{ 
    input = JOptionPane.showInputDialog(null, "Enter String", "Flashing Label", JOptionPane.QUESTION_MESSAGE); 
    blank=" "; 

    t=new Thread(this); 
    t.start(); 
} 

public void run() 
{ 
    while(true) 
    { 
     label=new JLabel(blank); 
     add(label); 
     this.repaint(); 
     label=new JLabel(input); 
     add(label); 
     this.repaint(); 
    } 
} 
} 
+2

NE PAS METTRE À JOUR L'interface DE TOUT FILET autre que l'événement Dispatching fil. Vous voudrez avoir une lecture de [Lesson: Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) – MadProgrammer

Répondre

3
  • Ne jamais rien faire dans le fil des événements qui Dispatching va bloquer (ou en cours d'exécution à long tâches IO), il fera paraître votre application comme il est accroché.
  • Ne jamais créer ou mettre à jour l'un des composants de l'interface utilisateur de tout fil autre que l'événement Dispatching Discussion
  • Il n'y a pas besoin de créer de nouvelles JLabel chaque fois que vous souhaitez mettre à jour le message, une utilisation simple JLabel#setText. Votre code ajoute actuellement deux nouvelles étiquettes sur chaque boucle à travers

Pour vos besoins, un simple javax.swing.Timer effectuera la tâche que vous essayez d'accomplir.

public class FlashApplet extends JApplet { 

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

       setLayout(new BorderLayout()); 
       add(new FlashPane()); 

      } 
     }); 
    } 

    @Override 
    public void start() { 
    } 

    public static class FlashPane extends JPanel { 

     protected static final String[] MESSAGES = {"Bad Boys", "What you gonna do"}; 

     private Timer flashTimer; 
     private JLabel label; 
     private int messageIndex = -1; 

     public FlashPane() { 
      setLayout(new BorderLayout()); 
      add((label = new JLabel())); 
      label.setHorizontalAlignment(JLabel.CENTER); 

      flashTimer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        messageIndex++; 
        if (messageIndex >= MESSAGES.length) { 
         messageIndex = 0; 
        } 
        label.setText(MESSAGES[messageIndex]); 
       } 
      }); 
      flashTimer.setRepeats(true); 
      flashTimer.setCoalesce(true); 
      flashTimer.setInitialDelay(0); 
      flashTimer.start(); 
     } 

    } 

} 

Vous aimeriez avoir une lecture par Concurrency in Swing

1

Pour rendre votre code sûr une idée serait de l'envelopper dans invokeLater (ou faire un fil fou chose sûre que je ne connais pas).

SwingUtilities.invokeLater(new Runnable(){ 
    public void run() 
    { 
    label=new JLabel(blank); 
    add(label); 
    for(int i =0;i < 4;i++) 
    { 
     label.setText(blank) ; 

     try{ 
      Thread.sleep(1000); 
     }catch(...){ 
     } 
     label.setText(input); 

    } 
    } 

Ajoutez votre étiquette, il est vide d'abord .. sommeil pour une seconde (changement en fonction de vos besoins), puis définissez à votre entrée. La dernière fois que j'ai fait quelque chose comme ça, ça a marché et c'était sur le fil principal de l'interface utilisateur.

+0

Donc, nous allons juste ignorer le fait que les demandes de mise à jour sont exécutées en dehors du ** thread de distribution d'événements ** – MadProgrammer