2017-05-03 26 views
0

我需要一種簡單的方法來製作可用於JLabel的方法。我想寫一個.write(一些文本);每當我調用jLabel.write(一些文本)的方法;它逐字寫出一些文字。我可以輕鬆地在控制檯上做到這一點,但我現在知道如何在JLabel中執行此操作。JLabel中的方法

示例代碼:

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"); 

出於顯而易見的原因,這是行不通的。但是有什麼辦法可以做到嗎?

+4

你至少應該用[併發在Swing(https://docs.oracle.com/javase/啓動tutorial/uiswing/concurrency /)和[如何使用Swing Timers](https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) - [一個非常基本的例子](http:///stackoverflow.com/questions/13691339/adding-a-timer-and-displaying-label-text/13691413#13691413) – MadProgrammer

+0

'JLabel'已經提供了可以使用的方法。 –

回答

1

要做到這一點,我們需要4個步驟:

  • 1)使該延伸的JLabel的一個新的類,
  • 2)增加了一個定時器和一個方法來寫的文字
  • 3)創建您的自定義的JLabel的實例,然後
  • 4)使用寫入方法步驟1

新的類和方法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; 
    } 
} 

新在main方法做第3步:

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

步驟4,您可以通過使用myLabel.write做你的方法:

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

感謝謝爾蓋Medvynskyy的評論,代碼已被糾正。

+0

您的代碼錯誤:您將在大約3秒內立即打印所有文本。無信件模式。你也應該重寫'getPreferredSize()'方法來提供正確的文本大小。 –

+0

@SergiyMedvynskyy正確的你,我糾正了我的答案,正確地打印延遲,但會讓'getPreferredSize()'使用默認行爲,因爲OP應該可能使用佈局管理器。 – sorifiend

2

這裏是標籤的完整的例子,你想:

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