【发布时间】:2019-04-08 07:50:03
【问题描述】:
如何平滑移动JPanel并同时更新JLabel?
我想在JFrame 上显示当前时间,所以我创建了一个新的java.util.Timer 并每隔一秒更新一次标签。
我还创建了另一个 Java 线程来移动面板组件。
但在移动面板并在框架上显示(更新)时间时,面板会刷新以形成原始位置。
所以我在 Google 中搜索该问题并找不到解决方案。
//Code to move jPanel smoothly
Thread t = new Thread(){
int i = 0 ;
public void run(){
while(i<150){
i++;
jPanel2.setLocation(i, jPanel2.getY());
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
}
};
t.start();
// Code to show Time
Timer t = new javax.swing.Timer(1, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText(new Date()+"");
}
});
t.start();
【问题讨论】:
-
1) 永远不要从另一个线程更新 Swing 组件。始终使用
javax.swing.Timer2) 1 表示计时器意味着 1 毫秒而不是 1 秒。 3) 请提供一个小型可运行类 (minimal reproducible example),以便我们重现您的问题。 -
所以我需要更改 Thread 而不是 javax.swing.timer 才能顺利移动 jPanel?
-
您需要 2 个
javax.swing.Timer对象。一个用于更新时钟标签,另一个用于机芯。在第二个计时器中,您还需要重新绘制移动组件的父级。 -
但它仍然无法完美运行。 :(
-
您的问题需要edit而不是start a new one!请阅读@SergiyMedvynskyy 链接的页面,因为上面的不可编译代码sn-p 不是 MCVE。
标签: java multithreading swing animation