primeira chamada ao construtor JFrame leva muito tempo durante a inicialização do aplicativo Swing (por causa de java.awt.Window ())

Estou tentando criar um aplicativo simples, leve e responsivo usando o Java Swing. Quando é iniciado, no entanto, há um atraso perceptível (> 500ms) antes da janela (um JFrame) aparece

Eu o localizei até o construtor da classe java.awt.Window, que é um ancestral do JFram

Estranhamente, o construtor é lento apenas para a primeira chamada. Se eu criar vários objetos JFrame, o tempo gasto no construtor é de ~ 600ms para o primeiro objeto, mas normalmente é medido como 0ms para objetos subsequente

Aqui está um exemplo simples que, no meu sistema, mostra esse atraso significativo na primeira chamada do construtor, mas não na segunda:

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            long start;

            start = System.currentTimeMillis();
            JFrame frame1 = new JFrame();
            System.out.println((System.currentTimeMillis() - start) + " for first JFrame.");

            start = System.currentTimeMillis();
            JFrame frame2 = new JFrame();
            System.out.println((System.currentTimeMillis() - start) + " for second JFrame.");
        }
    });
}

Com saída típica:

641 for first JFrame.
0 for second JFrame.

Se eu adicionar esta inicialização do objeto Window antes dos objetos JFrame:

java.awt.Window window = new java.awt.Window(null);

Então a saída muda para algo como:

578 for first Window.
47 for first JFrame.
0 for second JFrame.

Quando tento o mesmo com a superclasse de Window, java.awt.Container, o construtor Window ainda é o que leva muito tempo para ser executado (para que o problema não ultrapasse a classe Window

Desde que o construtor JFrame chama o construtor Window, o acima parece indicar que a primeira chamada para o construtor Window é car

O que acontece na primeira chamada ao construtor que demora tanto tempo e há algo que eu possa fazer sobre isso? Existe alguma correção simples ou o problema é fundamental para o Swing / AWT? Ou talvez seja um problema específico do meu sistema / instalação?

Gostaria que meu aplicativo fosse aberto tão rápido (ou quase tão rápido) quanto o MS Notepad e, enquanto eu puder imprimir o texto no console na mesma hora em que o Notepad for aberto (se eu colocar o código antes da primeira inicialização do JFrame), o problema acima significa que há quase um segundo inteiro de atraso antes que a janela seja visível. Vou precisar usar uma linguagem ou estrutura de GUI diferente para obter o desempenho que estou procurando?

Edita: Se eu adicionar Thread.sleep (10000) como a primeira linha de execução (), os resultados não serão alterados (eles aparecerão 10 segundos depois). Isso sugere que o problema não é causado por algum código de inicialização assíncrono, mas é acionado diretamente pela chamada do construto

Edit 2: Percebeu que o NetBeans Profiler pode criar um perfil dentro das classes JRE e descobriu que na maioria das vezes é gasto inicializando um objeto sun.java2d.d3d.D3DGraphicsDevice (o objeto Window precisa de limites e inserções de tela), que faz parte do "Direct3D Pipeline de renderização acelerada para plataformas Microsoft Windows, ativado por padrão ", introduzido emJava 6u10. Ele pode ser desativado passando a propriedade "-Dsun.java2d.d3d = false" para a JVM, o que reduz o tempo de inicialização em cerca de 3/4, mas ainda não tenho certeza se vou precisar (D3D) ou se houver outra maneira de fazer o carregamento mais rápido. Aqui está a saída se eu colocar esse parâmetro na linha de comando:

0 for first Window
47 for first JFrame.
0 for second JFrame.

Voltarei e limpo este post depois que eu me aprofundar mais tarde.

questionAnswers(5)

yourAnswerToTheQuestion