我尝试将JLabel从位置A移动到位置B顺序在相同的X和Y步骤中..方法正常工作,但不会更新我的gui .. 我在下面向您展示我的代码:
当我不打电话给。join()
方法时,代码可以正常工作,但不要等到我的另一个帖子执行......我需要这个功能不要当它实际运行时调用..任何人都可以帮助我吗?
Thread MoveThread = new Thread( new Runnable()
{
@Override
public void run()
{
for (int i = 0; i<Const.SteinVerschiebenSchritte; i++)
{
try
{
p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_schritt, p_lblToMove.getLocation().y + y_schritt);
System.out.println("SetLoc");
Thread.sleep(10);
}
catch (InterruptedException ex)
{
StatusLog("InterruptedException");
}
}
System.out.println("invokeLater");
p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_offset, p_lblToMove.getLocation().y + y_offset);
}
});
MoveThread.start();
try {
System.out.println("BeforeJoin");
MoveThread.join();
System.out.println("AfterJoin");
System.out.println("------------------");
} catch (InterruptedException ex) {
Logger.getLogger(Spielfeld.class.getName()).log(Level.SEVERE, null, ex);
}
答案 0 :(得分:2)
Swing是一个单线程环境,这意味着您不应该在Event Dispatching Thread的上下文中执行任何长时间运行或阻塞操作,同样,Swing也不是线程安全的,这意味着您应该只更新UI来自Event Dispatching Thread的上下文。
有关详细信息,请参阅Concurrency in Swing。
根据您要实现的目标,您可以使用SwingWorker
,有关详细信息,请参阅Worker Threads and SwingWorker,或使用Swing Timer
,有关详细信息,请参阅How to use Swing Timers
还要记住,在定位和调整组件大小时,Swing依靠布局管理器来完成大部分核心工作,您可能会发现您正在与可能导致意外结果的布局管理器作斗争
当然,您可以随时查看The Universal Tween Engine和Sliding layout或Java: Moving jLabel twice using Timer