测试游戏时,我有时会在组件不可显示时抛出异常。我在isDisplayable()上添加了一个等待循环。
好像我的游戏可能需要几百毫秒。变得可以显示。
这是处理这个问题的理智方式吗?
我正在测试通过套接字与服务器通信的游戏客户端。
感谢
编辑1:感谢您的评论。我发现在gui完成构建和初始化之前,我正在为模型(一个观察者)添加gui(一个观察者)的中介。它变得更糟,因为我正在初始化一个面板,调用createImage,返回null并抛出。
import java.awt.*;
import javax.swing.*;
public class WaitForFrameToBeVisible {
JFrame frame=new JFrame("FrameDemo");
private void createAndShowGUI() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel emptyLabel=new JLabel("");
emptyLabel.setPreferredSize(new Dimension(175,100));
frame.getContentPane().add(emptyLabel,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
void run() throws Exception {
System.out.println("waiting for frame to be displayable");
long t0=System.nanoTime();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
while (!frame.isDisplayable())
Thread.sleep(1);
long dt=System.nanoTime()-t0;
System.out.println("waited "+dt/1_000_000.+" ms. for frame to be displayable");
}
public static void main(String[] args) throws Exception {
new WaitForFrameToBeVisible().run();
}
}
答案 0 :(得分:0)
您不需要使用isDisplayable()
。你可以使用invokeAndWait(...)
来做你想做的事情:
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
// control will reach here when the GUI will be created
请注意,通过这种方式,您实际上并未检查框架是否可见但是您正在检查createAndShowGUI()是否已完成其工作
另一件事是你不应该在循环中调用isDisplayable()
或这样的任何函数。它会消耗不必要的处理速度。而是使用wait-notify。
但就你的案例而言,使用WindowListener
是MadProgrammer在评论中提出的非常好的主意。