gpt4 book ai didi

Java 在 MainThread.join() 时更新 GUI?

转载 作者:行者123 更新时间:2023-11-30 03:14:45 26 4
gpt4 key购买 nike

我尝试以相同的 X 和 Y 步顺序将 JLabel 从位置 A 移动到位置 B。该方法工作正常,但没有更新我的 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);
}

最佳答案

Swing 是单线程环境,这意味着您不应在事件调度线程的上下文中执行任何长时间运行或阻塞操作,同样,Swing 也不是线程安全的,这意味着您应该只更新 UI来自事件调度线程的上下文。

参见Concurrency in Swing了解更多详情。

根据您想要实现的目标,您可以使用 SwingWorker,请参阅 Worker Threads and SwingWorker有关更多详细信息,或 Swing Timer,请参阅 How to use Swing Timers了解更多详情

还请记住,在定位和调整组件大小时,Swing 依赖布局管理器来完成大部分核心工作,您可能会发现您正在与布局管理器作斗争,这可能会导致意外结果

当然,您可以随时查看The Universal Tween EngineSliding layoutJava: Moving jLabel twice using Timer

关于Java 在 MainThread.join() 时更新 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32916767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com