0

测试游戏时,我有时会在组件不可显示时抛出异常。我在 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();
    }
}
4

1 回答 1

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()在循环中调用或任何类似的函数。它将消耗不必要的处理速度。而是使用等待通知。

但就您的情况而言,正如MadProgrammer在评论中WindowListener所建议的那样,使用是一个非常好的主意。

于 2015-06-26T01:00:22.040 回答