我在java中遇到问题,我不认识他,我解决了。
我创建了一个简单的程序,使用JPanel
和for
函数插入到文本sleep
中。
像这样(这是一个例子):
public class example{
JFrame frame....
..
..
public example(){
//ini frame and label.. then..
String s = "abcqweewqewqewqewqweqwqeweqweqwq";
//DO ANIMATION
try
{
for(int i = 0;i<s.length();i++)
{
JLABEL.append(String.valueOf(s.charAt(i)));
Thread.sleep(10);
}
}catch(Exception ex){}
}
public static void main.......{
new example();
}
}
它完美地工作(在一定时间间隔后写字符) 但,如果我使用其他类调用此主 - 所以等到所有渲染然后窗口出现(所以不动画)。
哪里有问题?我希望,你了解我。
答案 0 :(得分:3)
Swing是单线程的,正确编写的swing代码在event dispatch thread中运行。您的示例通过在EDT外部创建GUI来中断线程规则,并且还在主线程中运行循环。通常,在EDT中正确创建时,或者作为对按钮点击或类似事件的响应,循环会阻止事件调度线程,以便在循环完成之前不会发生绘图。 / p>
如果在事件派发线程中初始化GUI,则会出现这种情况:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new example()
}
});
}
正确的方式是使用Swing Timer。
而不是在EDT中睡觉总结一下:你的代码似乎只是因为它有错误,它运行事件派发线程之外的一些UI代码。