2017-05-03 1 views
0

J'ai besoin d'un moyen simple de créer des méthodes pouvant être utilisées dans un JLabel. Je veux faire un .write (du texte); Méthode qui chaque fois que j'appelle jLabel.write (du texte); il écrit un texte lettre par lettre. Je peux facilement le faire avec la console, mais je sais maintenant comment le faire dans un JLabel.Méthodes dans JLabels

Exemple de code:

public void write(String a) { 
    char letter; 
    String word = ""; 
    for(int i = 0; i < a.length(); i++) { 
     letter = a.charAt(i); 
     this.setText(word + letter); 
     word = word + letter; 
     try { 
      Thread.sleep(100); 
     } catch(Exception e) { 
     } 
    } 
} 

...

text.write("Hello"); 

Pour des raisons évidentes, cela ne fonctionne pas. Mais y a-t-il un moyen de le faire?

+4

Vous devriez au moins commencer par [Concurrency Swing] (https://docs.oracle.com/javase/ tutorial/uiswing/concurrency /) et [Comment utiliser Swing Timers] (https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) - [Pour un exemple vraiment basique] (http://stackoverflow.com/questions/13691339/adding-a-timer-and-displaying-label-text/13691413#13691413) – MadProgrammer

+0

'JLabel' fournit déjà des méthodes que vous pouvez utiliser. –

Répondre

1

Pour ce faire, nous avons besoin de 4 étapes:

  • 1) faire une nouvelle classe qui étend une JLabel,
  • 2) ajoute une minuterie et une méthode pour écrire le texte
  • 3) créer une instance de votre commande JLabel, puis
  • 4), utilisez votre méthode d'écriture

Nouvelle classe et de méthode pour les étapes 1 et 2:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JLabel; 
import javax.swing.Timer; 

public class MyCustomJLabel extends JLabel{ 
    private String text = ""; 

    public void write(String textToWrite) { 
     int delay = 1000; //milliseconds 
     ActionListener taskPerformer = new ActionListener(){ 
      int characterCount = 0; 
      public void actionPerformed(ActionEvent evt){ 
       if (characterCount == textToWrite.length()) 
       { 
        ((Timer)evt.getSource()).stop(); 
       } 
       getThisLabel().setText(textToWrite.substring(0, characterCount)); 
       characterCount++; 
      } 
     }; 
     new Timer(delay, taskPerformer).start(); 
    } 

    private MyCustomJLabel getThisLabel(){ 
     return this; 
    } 
} 

Nouveau dans votre principale méthode faire l'étape 3:

MyCustomJLabel myLabel = new MyCustomJLabel(): 
myForm.add(myLabel); 

Etape 4, vous pouvez faire votre méthode en utilisant myLabel.write:

myLabel.write("my text to print 1 letter at a time"); 

Merci Sergiy Medvynskyy pour le commentaire, le code a été corrigé.

+0

Votre code est erroné: vous recevrez tout votre texte en une fois dans environ 3 secondes. Aucun modèle de lettre par lettre. De même, vous devez remplacer la méthode 'getPreferredSize()' pour obtenir un dimensionnement correct de votre texte. –

+0

@SergiyMedvynskyy Vous avez raison, j'ai corrigé ma réponse pour imprimer correctement avec un délai, mais je laisserai 'getPreferredSize()' utiliser le comportement par défaut car OP devrait probablement utiliser un gestionnaire de disposition. – sorifiend

2

Voici l'exemple complet de l'étiquette, vous voulez obtenir:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.WindowConstants; 

public class JPrintLabel extends JLabel { 

    private Dimension storedSize; 

    private Timer printTimer; 

    public void write(final String text) { 
     // stop old timer if required 
     if (printTimer != null) { 
      printTimer.stop(); 
     } 
     // compute size 
     if (!isPreferredSizeSet()) { 
      setText(text); 
      storedSize = getPreferredSize(); 
      setText(""); 
     } 
     printTimer = new Timer(200, new ActionListener() { 
      int counter; 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (counter >= text.length()) { 
        printTimer.stop(); 
        printTimer = null; 
       } else { 
        setText(text.substring(0, ++counter)); 
       } 
      } 
     }); 
     printTimer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet() || storedSize == null) { 
      return super.getPreferredSize(); 
     } else { 
      return storedSize; 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frm = new JFrame("Test print"); 
       JPrintLabel pl = new JPrintLabel(); 
       frm.add(pl); 
       pl.write("Here is the text, we want to print!"); 
       frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frm.pack(); 
       frm.setLocationRelativeTo(null); 
       frm.setVisible(true); 
      } 
     }); 
    } 
}