gpt4 book ai didi

java - Java Swing 中奇怪的并发问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:49:18 26 4
gpt4 key购买 nike

我有一个 Jframe,它是我的应用程序的窗口(以下代码中的 appFrame),它包含很多逻辑并且需要 1 秒左右的时间来加载。与此同时,我想向我的用户展示一个非常漂亮的加载框架 (initFrame)。然而,当我运行这段代码时,initFrame 确实出现了,但它上面的 JLabel 中的文本并没有立即出现——实际上它在加载应用程序框架之前的短暂时刻根本没有出现。

如果我注释掉所有的 appFrame,只启动 initFrame,文本会立即加载,根本没有等待时间。为什么会这样?这可能是并发问题吗?

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { //as per best practice for concurrency in swing - see http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
@Override
public void run() {
final JFrame initFrame = new InitFrame();
initFrame.setVisible(true);
final AppFrame appFrame = new AppFrame();
appFrame.setVisible(true);
initFrame.setVisible(false);
initFrame.dispose();
}
});

}

最佳答案

我会将框架的创建分成两个线程。首先,初始化InitFrame。运行此线程并调用 isShowing()InitFrame 对象上。当它返回 true 时,运行第二个线程来初始化并显示 AppFrame

这将强制两个框架的可见性之间发生先行关系。

class Main {
JFrame initFrame = null;
AppFrame appFrame = null;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initFrame = new InitFrame();
initFrame.setVisible(true);
}
});

while(!initFrame.isShowing()) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
appFrame = new AppFrame();
appFrame.setVisible(true);
initFrame.setVisible(false);
initFrame.dispose();
}
});

}
}

关于java - Java Swing 中奇怪的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346027/

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