Java JLabels中的方法

Java JLabels中的方法,java,swing,methods,jlabel,Java,Swing,Methods,Jlabel,我需要一种简单的方法来创建可以在JLabel中使用的方法。我想写一篇文章;每当我调用jLabel.write(一些文本)时使用的方法;它逐字写出一些文字。我可以用控制台轻松地完成这项工作,但我现在知道如何在JLabel中完成这项工作 示例代码: public void write(String a) { char letter; String word = ""; for(int i = 0; i < a.length(); i++) { lette

我需要一种简单的方法来创建可以在JLabel中使用的方法。我想写一篇文章;每当我调用jLabel.write(一些文本)时使用的方法;它逐字写出一些文字。我可以用控制台轻松地完成这项工作,但我现在知道如何在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) {
        }
    }
}

显然,这是行不通的。但是有没有办法做到这一点呢?

要做到这一点,我们需要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;
    }
}
在您的主要方法中新增步骤3:

MyCustomJLabel myLabel = new MyCustomJLabel():
myForm.add(myLabel);
第4步,您可以使用
myLabel.write

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

感谢Sergiy Medvynskyy的评论,代码已更正。

为此,我们需要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;
    }
}
在您的主要方法中新增步骤3:

MyCustomJLabel myLabel = new MyCustomJLabel():
myForm.add(myLabel);
第4步,您可以使用
myLabel.write

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

感谢Sergiy Medvynskyy的评论,代码已更正。

以下是标签的完整示例,您希望获得:

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

下面是标签的完整示例,您需要获得:

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

您至少应该从和开始-
JLabel
已经提供了您可以使用的方法。您至少应该从和开始-
JLabel
已经提供了您可以使用的方法。您的代码是错误的:您将在大约3秒钟内一次打印所有文本。没有一个字母一个字母的模式。您还应该重写
getPreferredSize()
方法以提供正确的文本大小。@Sergiymedvynsky您说得对,我已经更正了我的答案以正确打印,但会让
getPreferredSize()延迟打印
使用默认行为,因为OP可能应该使用布局管理器。您的代码错误:您将在大约3秒钟内一次性打印所有文本。没有一个字母一个字母的模式。您还应该重写
getPreferredSize()
方法以提供正确的文本大小。@Sergiymedvynsky您说得对,我已经更正了我的答案,以延迟正确打印,但将允许
getPreferredSize()
使用默认行为,因为OP可能应该使用布局管理器。