Java JLabels中的方法
我需要一种简单的方法来创建可以在JLabel中使用的方法。我想写一篇文章;每当我调用jLabel.write(一些文本)时使用的方法;它逐字写出一些文字。我可以用控制台轻松地完成这项工作,但我现在知道如何在JLabel中完成这项工作 示例代码: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
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) 使用你的写作方法
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) 使用你的写作方法
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可能应该使用布局管理器。