Scott Hetrick
Scott Hetrick

Reputation: 161

JFrame Start Up Display Delay

I am having difficulties displaying a JFrame with all of the contents showing immediately. I would like to show the JFrame with all Components already added, but the window appears to become visible out-of-focus, wait a second, then come into focus with the Component(s) added. The code for my SSCCE is extremely short/simple, so I don't know why this effect is happening.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DelayTest
{
    public static void main(String[] args)
    {
        JLabel label = new JLabel("DELAY TEST");
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setPreferredSize(new Dimension(400, 60));
        JFrame frame = new JFrame("Delay Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(label);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

I know that this effect does not happen if I comment out label.setPreferredSize(new Dimension(400,60));, so though it may simply be a correlation & not a causation, I'm guessing somehow PreferredSizes have to do with it. But, why?

ALSO, this effect occurs even if I create the GUI in a separate Runnable thread apart from the main thread. Although clearly the effect is related to the order of thread execution, I do not believe that specific factor is the cause.

Upon startup:

enter image description here

About 1 second later:

enter image description here

Upvotes: 0

Views: 679

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347234

The likely delay is caused by the need for the system to initialize the synchronize the Event Dispatching Thread with the native system before it can render content.

You should make sure that your UI is initialised and shown from within the context of the Event Dispatching Thread, which should make the initial startup more synchronised...

enter image description here

Take a look at Initial Threads for more details

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestDelay {

    public static void main(String[] args) {
        new TestDelay();
    }

    public TestDelay() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JLabel label = new JLabel("Delay Test");
                Font font = label.getFont();
                label.setFont(font.deriveFont(Font.BOLD, 24f));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

Upvotes: 1

Related Questions