Waiting on isDisplyable for a component

67 views Asked by At

testing a game, i sometimes get exceptions thrown when a component is not displayable. i added a wait loop on isDisplayable().

seems like my game can take a few hundred ms. to become displayable.

is this a sane way to handle this problem?

i am testing game clients that talk over sockets to a server.

thanks

edit 1: thanks for the comments. i discovered that i am adding the mediator for the gui (an observer) to the model (an observable) before the gui completes its construction and initialization. it gets worse, as i am initializing a panel with calls to createImage which returns null and throws.

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

There are 1 answers

3
afzalex On

You don't need to use isDisplayable(). You could use invokeAndWait(...) for what you are trying to do :

 javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
     public void run() {
         createAndShowGUI();
     }
 });
 // control will reach here when the GUI will be created

Notice that this way you are not actually checking if the frame is visible but you are checking if createAndShowGUI() has done its work

Another thing is you should not call isDisplayable() or any function like this in loop. It will consume unnecessary processing speed. Instead use wait-notify.

But as far as your case is concerned to use WindowListener is very good idea as suggested by MadProgrammer in comment.