当前位置: 技术问答>java相关
实现走马灯效果的JLabel,但是有个小问题,大家一定要看看!!!!!!!!!!!!!
来源: 互联网 发布时间:2015-08-16
本文导语: 我不知道为什么?难道?哎,不知道,大家帮帮忙! 下面是一个实现走马灯效果的JLabel,即如果该Label上的字长度超过了Label的宽度,那么字就会滚动 滚动效果是这样的:如果是"abcdefg",但是Label上只有显示3个字符的宽度(...
我不知道为什么?难道?哎,不知道,大家帮帮忙!
下面是一个实现走马灯效果的JLabel,即如果该Label上的字长度超过了Label的宽度,那么字就会滚动
滚动效果是这样的:如果是"abcdefg",但是Label上只有显示3个字符的宽度(假设是等宽字体),那么Label上就这
样显示
abc=>(wait 10 seconds)=>bcd=>cde=>def=>efg=>
abc=>(wait 10 seconds)=>bcd=>...(循环往复)
但是下面的这个程序却是: abc=>bcd=>cde=>def=>efg=>(wait 10 seconds)=>
abc=>bcd=>...(循环往复)
两者的差异就是:我想让开始3字符多显示的时间长一点(10秒钟),但是结果确是最后3字符显示的时间变长了
package course;
import javax.swing.*;
import java.awt.FontMetrics;
import java.awt.event.*;
/**
*
Title:
*
Description:
*
Copyright: Copyright (c) 2002
*
Company:
* @author unascribed
* @version 1.0
*/
public class JScrollLabel extends JLabel implements ActionListener{
private int visibleWidth = 20; // default visibleWidth
private String oldText = ""; // save last value
private Timer timer = new Timer(150, this); // Scroll Timer, 每150毫秒滚动一个字符
private int subInterval = 1; // one char per timer.trigger 每次滚动的字符数
private FontMetrics fm = null; // for get width of text
public JScrollLabel() {
this("");
}
public JScrollLabel(String text) {
super(text);
fm = getFontMetrics(getFont());
}
public void actionPerformed(ActionEvent e) {
if(getText().equals("")) return;
String newText = getText().substring(subInterval);
int strWidth = fm.stringWidth(newText);
if(strWidth > visibleWidth) {
setTextNoPaint(newText);
} else {
//!!!!!!! 下面出了问题,运行就如同先sleep(10000),然后才setTextNoPaint(oldText)
// 到最后了,现在重新开始滚动
setTextNoPaint(oldText);
System.out.println("setText("+oldText+")");
// 但是需要先暂停10秒钟
try {
Thread.sleep(10000);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
timer.restart();
}
}
public void setVisibleWidth(int vWidth) {
System.out.println("set visible width is " + vWidth);
if(vWidth > 0)
visibleWidth = vWidth;
}
/**
* override setText(String)
*/
public void setText(String text) {
if(!text.equals(oldText)) {
setTextNoPaint(text);
oldText = text;
// called by super(text), as timer is null that time
if(timer!=null) timer.restart();
}
}
public void setTextNoPaint(String text) {
super.setText(text);
}
}
|
恭喜,我还不知道restart()!害的我找了半天, 哈哈