JDialog, setVisible(boolean) interrompe execução do método
8 respostas
wilsontads
Segue abaixo, código comentado com o que acontece.
Alguém já lidou com isso antes aqui ?
Threadth=newThread(newRunnable(){@Overridepublicvoidrun(){try{newDialog=newNewDialog(this,true);newDialog.setVisible(true);// Aqui, o JDialog é exibido, e as linhas abaixo não são executadas.newDialog.setLog("1...",true);//Método que no JDialog carrega em um JList os valores da StringnewDialog.setLog("2...",true);newDialog.setLog("3...",true);newDialog.setLog("4...",true);}catch(Exceptione){e.printStrackTrace();}}});
Se o diálogo for modal, o método setVisible() será bloqueante, como está ocorrendo no seu caso.
wilsontads
Verdade, mais nesse caso preciso dele modal, existe uma maneira de contornar isto ?
TerraSkilll
Não sei qual a situação em que seu dialog é chamado, mas simplesmente alterar a ordem dos métodos não resolve?
Threadth=newThread(newRunnable(){@Overridepublicvoidrun(){try{newDialog=newNewDialog(this,true);// chama-se o setLog() antes de exibir o dialognewDialog.setLog("1...",true);newDialog.setLog("2...",true);newDialog.setLog("3...",true);newDialog.setLog("4...",true);newDialog.setVisible(true);}catch(Exceptione){e.printStrackTrace();}}});
Abraço.
E
entanglement
Iniciar uma thread e então dessa thread iniciar um JDialog ou outra coisa do Swing não é uma boa coisa, porque irá iniciar um componente do Swing em uma thread errada (não na thread do Swing). Isso costuma dar problemas esquisitos que não são triviais de consertar.
Em .NET isso gera até uma exceção. O Swing, nesse ponto, não é tão criterioso e deixa você fazer esses erros.
Se você precisa usar alguma coisa do Swing fora da thread do Swing, você deve usar SwingUtilities.invokeAndWait ou SwingUtilities.invokeLater e dentro do Runnable que esse invokeAndWait ou invokeLater exige, chame as APIs do Swing (como a visualização do JDialog).
wilsontads
dessa forma, ele da uma congelada no swing. =\
SwingUtilities.invokeAndWait(newRunnable(){@Overridepublicvoidrun(){try{newDialog=newNewDialog(null,false);newDialog.setVisible(true);newDialog.setLog("1...",true);newDialog.setLog("2...",true);newDialog.setLog("3...",true);newDialog.setLog("4...",true);}catch(Exceptione){MessageDialog.errorMessage("O teste falhou.\n"+e.getMessage(),"Erro");}}});
wilsontads
entanglement:
Iniciar uma thread e então dessa thread iniciar um JDialog ou outra coisa do Swing não é uma boa coisa, porque irá iniciar um componente do Swing em uma thread errada (não na thread do Swing). Isso costuma dar problemas esquisitos que não são triviais de consertar.
Em .NET isso gera até uma exceção. O Swing, nesse ponto, não é tão criterioso e deixa você fazer esses erros.
Se você precisa usar alguma coisa do Swing fora da thread do Swing, você deve usar SwingUtilities.invokeAndWait ou SwingUtilities.invokeLater e dentro do Runnable que esse invokeAndWait ou invokeLater exige, chame as APIs do Swing (como a visualização do JDialog).
Fiz como você disse, só que não resolve pra mim, dessa maneira minha tela sofre o congelamento, como se eu nem estivesse executando uma thread.
Ataxexe
wilsontads:
entanglement:
Iniciar uma thread e então dessa thread iniciar um JDialog ou outra coisa do Swing não é uma boa coisa, porque irá iniciar um componente do Swing em uma thread errada (não na thread do Swing). Isso costuma dar problemas esquisitos que não são triviais de consertar.
Em .NET isso gera até uma exceção. O Swing, nesse ponto, não é tão criterioso e deixa você fazer esses erros.
Se você precisa usar alguma coisa do Swing fora da thread do Swing, você deve usar SwingUtilities.invokeAndWait ou SwingUtilities.invokeLater e dentro do Runnable que esse invokeAndWait ou invokeLater exige, chame as APIs do Swing (como a visualização do JDialog).
Fiz como você disse, só que não resolve pra mim, dessa maneira minha tela sofre o congelamento, como se eu nem estivesse executando uma thread.
Na verdade isso não é uma solução para o seu problema. É algo obrigatório pra quem trabalha com Swing e que poderia ser uma solução, mas não deixe de usar as Threads do Swing.
E
elissonandrade
Não faça invoke and wait, faça invokeLater, que dai é assincrono.