等待组件的isDisplyable

时间:2015-06-26 00:41:21

标签: java swing invokelater

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

1 个答案:

答案 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。

但就你的案例而言,使用WindowListenerMadProgrammer在评论中提出的非常好的主意。