假设我有一个JWindow和一个名为TestWindow和TestFrame的JFrame,它们都应该同时显示,为什么TestWindow只绘制一个没有标签的空白灰色窗口,而TestFrame在while(true)内? ?
为什么我删除了while(true),TestWindow正确显示?
这是一个更复杂的程序示例,我需要在主应用程序启动时显示启动画面需要1或2秒。 在此期间,无论主应用程序的状态如何,都应显示启动画面,而只有当主应用程序已经完成时才会显示启动画面,invokeAndWait实际上并没有等待初始化启动画面。
TestFrame.java :
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class TestFrame extends JFrame
{
public static void main(String args[])
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run()
{
new TestWindow();
}
});
}
catch (Exception ex)
{
Logger.getLogger(TestFrame.class.getName()).log(Level.SEVERE, null, ex);
}
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new TestFrame();
}
});
}
public TestFrame()
{
super("TestFrame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(new JLabel("sss"), BorderLayout.CENTER);
setSize(500, 120);
setVisible(true);
while(true)
{
//this makes the other not show
}
}
}
TestWindow.java :
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
public class TestWindow
{
public TestWindow()
{
JWindow jWindow = new JWindow();
JPanel contentPanel = new JPanel();
final JLabel label = new JLabel("Test Window");
contentPanel.add(label, BorderLayout.CENTER);
jWindow.add(contentPanel);
jWindow.setSize(300, 200);
jWindow.setAlwaysOnTop(true);
jWindow.setVisible(true);
}
}
修改:
顺便说一句,我意识到要放一个
catch (Exception ex)
{
Logger.getLogger(TestFrame.class.getName()).log(Level.SEVERE, null, ex);
}
try
{
Thread.sleep(1000);
}
两个TestWindow和TestFrame创建之间的实际上解决了这个问题,是不是没有比这更少的hacky ???
答案 0 :(得分:3)
正在Swing事件调度线程或EDT上调用您的while (true)
循环,将其绑定并阻止此线程执行必要的操作,包括绘制所有GUI并与用户交互。解决方案很简单 - 1)摆脱while循环(正如你已经想到的那样),或者2)如果循环是绝对必要的,那就在后台线程中完成。
有关Swing线程的更多详细信息,请查看Lesson: Concurrency in Swing。