Problemas com JFrame

Olá!
Está acontecendo um comportamento estranho com uma janela que criei no java.
Ao aparecer na tela, algumas vezes ela simplesmente não responde a nenhuma ação (não fecha nem reconhece o KeyListener), depois de uns 15 segundos ela volta ao normal.

O que pode ser?
Obrigado!

Só vendo a implementação do seu código, assim não tem como adivinhar.

o que quer ver?

Classe da Janela é mais ou menos assim

private JFrame frame;
private Canvas canvas;

public JanelaTeste() {
	
	frame = new JFrame();
	canvas = new Canvas();
	
	configurar();
	
}

private void configurar() {
	
	frame.setTitle("Test");
	frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	frame.add(canvas);
	frame.setVisible(true);
	
	canvas.createBufferStrategy(2);
	
}

Bom, o código postado não mostra como a janela é apresentada nem onde são registrados os listeners.

Bem, os listeners não são necessários, pois citei eles só para exemplificar,
eu estou reportando um comportamento estranho da janela que ao ser iniciada, demora cerca de 15 segundos antes de começar a responder alguma entrada.

teste.rar (10,9 KB)
Tem aí um programa que reproduz o mesmo comportamento, junto com o código-fonte.
Execute o programa algumas e vezes e tente fechá-lo imediatamente, se o problema for no código com eu acho, a janela vai demorar fechar.

Agradeço imensamente sua ajuda!

Então, em minha máquina funciona normalmente consigo fechar a janela imediatamente após ela aparecer.

Entretanto receio que o problema esteja na implementação do método Game.run():

public void run() {
	running = true;
	load();
	
	long nano = System.nanoTime();
	while (running) {
		while (System.nanoTime() > nano) {
			update();
			nano += 20_000_000;
		}
		render();
	}
	unload();
}

Como você tem um laço que fica constantemente processando algo sem ceder uma fatia de tempo para outros processos, pode acontecer da sua janela “congelar” por alguns instantes, mas isso pode variar de máquina para máquina.
Se eu fosse você faria o código do run ser executado em uma Thread separada e incluiria chamadas ao Thread.yield() dentro do laço, assim:

public void run() {
	if (running) {
		return;
	}
	running = true;
	Thread thread = new Thread(new Runnable() {
		
		public void run() {
			load();
			long nano = System.nanoTime();
			while (running) {
				while (System.nanoTime() > nano) {
					update();
					nano += 20_000_000;
					Thread.yield();
				}
				render();
				Thread.yield();
			}
			unload();
		}

	}, "Game Loop");
	thread.start();
}
1 curtida

Realmente, eu usava esse método antes, mas eu tinha o desprezado e nem lembrei dele.
Obrigado!