Olá, galerinha do GUJ!
Tudo beleza?
Estou com um problema aqui…
Bom, eu tenho uma classe ClienteSplash que será uma telinha Splash que criei, bem básica:
public class ClienteSplash extends JDialog
{
public ClienteSplash(String anCliente)
{
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setModal(true);
iniciarComponentes(anCliente);
}
private void iniciarComponentes(String anCliente)
{
JPanel anPanel = new JPanel();
anPanel.setPreferredSize(new Dimension(300, 100));
anPanel.setBorder(null);
JLabel anLabel = new JLabel(String.format("Aguarde, criando a base de dados para %s...", anCliente));
anLabel.setFont(new Font("Tahoma", 0, 11));
anPanel.add(anLabel);
setContentPane(anPanel);
pack();
setLocationRelativeTo(null);
}
Daí beleza… Eu quero que essa tela seja chamada durante a execução de uma determinada operação na minha base de dados, que consume quase 8 segundos (criar um novo banco de dados).
Estou fazendo algo assim:
// Esta é a operação que deve ser executada no banco de dados.
Runnable firstRunnable = new Runnable()
{
public void run()
{
try
{
anModelo.criarBancoCliente(anCliente);
}
catch (Exception err)
{
err.printStackTrace();
}
}
};
// Aqui representa a tela Splash.
Runnable secondRunnable = new Runnable()
{
final ClienteSplash anSplash = new ClienteSplash(cf.getDados().get("nome").toString());
public void run()
{
anSplash.setVisible(true);
}
@Override public void finalize() throws Throwable
{
anSplash.dispose();
}
};
Thread firstThread = new Thread(firstRunnable); // Criar a base de dados.
Thread secondThread = new Thread(secondRunnable); // Mostrar a tela splash.
firstThread.start(); // Inicia operação de criar a base de dados...
secondThread.start(); // Inicia a tela splash...
Thread.sleep(8000); // Espera 8 segundos...
secondThread.interrupt(); // Some com a tela splash...
firstThread.interrupt(); // E termina a operação.
Beleza, e vem o problema: As duas threads não estão sincronizadas. Eu mando executar a primeira e, em seguida, mostrar a tela splash. Aqui tem um problema: ao invés de mostrar os componentes, mostra um quadro vazio!
Daí tá… Mostra a tela splash e tudo o mais, espera os 8 segundos… Mas a tela Splash não tá fechando depois dos 8 segundos. O registro é adicionado na tabela, mas a tela não fecha de jeito nenhum.
Alguém tem ideia de como solucionar isso?
Valeu, galera, grande abraço!