2017-05-03 14 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つのステップ必要これを行うために

+4

あなたは、少なくとも[スイングにおける同時実行](https://docs.oracle.com/javase/で始まる必要がありますチュートリアル/自動化/並行性/)と[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

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

新しいステップ3を実行します。

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

ステップ4を、あなたはmyLabel.writeを使用して、あなたの方法を行うことができます。コメントを

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

おかげSergiy Medvynskyy、コード修正されました。ここで

+0

コードが間違っています:約3秒ですべてのテキストを一度に印刷できます。文字パターンによる手紙なし。また、 'getPreferredSize()'メソッドをオーバーライドして、テキストのサイズを正しく設定する必要があります。 –

+0

@SergiyMedvynskyyさて、あなたは、遅延で正しく印刷する答えを修正しましたが、OPはおそらくレイアウトマネージャを使用しているはずなので、 'getPreferredSize()'にデフォルトの動作を使用させます。 – 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); 
      } 
     }); 
    } 
}