有什么办法可以显示一个短语,就其本身而言,“欢迎!”,一个字母一个字母,它们之间有很小的延迟?我会提供我尝试过的东西,但我什至还没有接近几乎没有工作,没有什么值得一提的。我想我必须使用一个包含扫描仪的循环,是吗?任何帮助表示赞赏,谢谢:)
问问题
3328 次
1 回答
3
注意事项
Swing 是一个单线程框架,也就是说,对 UI 的所有更新和修改都应该在 Event Dispatching Thread 的上下文中执行。
同样,任何阻塞 EDT 的操作都将阻止它处理(除其他外)、绘制更新,这意味着 UI 将在块被删除之前不会更新。
例子
有几种方法可以实现这一目标。您可以使用SwingWorker
and 虽然这将是一个很好的学习练习,但对于这个问题,它可能有点过头了。
相反,您可以使用javax.swing.Timer
. 这允许您定期安排回调,这些回调在 EDT 的上下文中执行,您可以安全地更新 UI。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class AnimatedLabel {
public static void main(String[] args) {
new AnimatedLabel();
}
public AnimatedLabel() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.setSize(100, 100);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private String text = "Hello";
private JLabel label;
private int charIndex = 0;
public TestPane() {
setLayout(new GridBagLayout());
label = new JLabel();
add(label);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String labelText = label.getText();
labelText += text.charAt(charIndex);
label.setText(labelText);
charIndex++;
if (charIndex >= text.length()) {
((Timer)e.getSource()).stop();
}
}
});
timer.start();
}
}
}
查看Swing 中的并发以获取更多详细信息
从评论更新
主要问题是您的text
价值包含在<html>
static String text = "<html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html>";
然后你把它应用到你的标签上......
final JLabel centerText = new JLabel(text);
所以当计时器运行时,它最终会再次附加文本......
"<html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html><html>Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. </html>"
这是无效的,因为之后的所有内容都</html>
将被忽略。
相反,<html>
从text
static String text = "Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that.";
并将标签的初始文本设置为<html>
final JLabel centerText = new JLabel("<html>);
不用担心,Swing 会处理的...
于 2013-09-17T02:09:01.540 回答