在挥杆中我制作了一个JLabel(用于天文台)。我正在使用一个循环并每秒睡眠的线程,所以每秒我写秒。
代码:
new thread(){
public void run(){
int i=0;
while(true){
try{
sleep(1000);
}catch(Exception e){}
i++;
jlabel1.settext(i);
}
}
}.start();
然后我使用另一个线程作为移动面板jpanel1
new thread(){
public void run(){
while(true){
try{
sleep(100);
}catch(Exception e){}
j+=15;
j=j%400;
jpanel1.setLocation(j,50);
}
}
}.start();
如何修复此代码,因为当标签的setText()
每秒完成时,面板会很奇怪(他从原点开始然后返回当前点)
我所有的研究都表明,在绘制组件时,Java的摇摆和awt并不是一种安全的方法。
有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
我的所有研究都表明,当涉及到绘画作品时,java swing和awt不是一种安全的方法
这些都是正确的,必须在Event Dispatch Thread (EDT)中创建和更新Swing组件。有关详细信息,请参阅Concurrency in Swing教程。
这里发生的事情是Swing组件(标签和面板)正在外面更新EDT。要解决这个问题,并且根据您的要求制作计时器,最有用的工具是Swing Timer(链接到教程),它将在给定的时间段内执行重复任务,并且可以安全地在其中执行Swing组件更新。 actionPerformed()
实施,因为那些在EDT中运行。
例如:
Timer timer = new Timer(1000, new ActionListener() {
int i = 0;
@Override
public void actionPerformed(ActionEvent e) {
i++;
label.setText(String.valueOf(i));
}
};
timer.setRepeats(true); // it will be repeated every 1 sec.
timer.start();