[RESOLVIDO, MAS NÃO ENTENDIDO] JDialog não aparece - mas consigo acessála pelo ALT+ESPAÇO
6 respostas
PauloBrito
Tenho uma aplicação em java que é controlada por uma outra aplicação via stdin. Essa outra aplicação envia os comando e minha aplicação em java faz o processamento e retorna em stdout, eventualmente mostrando diálogos.
Até então só estava utilizando JOptionPane para os diálogos, porém precisei implementar um usando JDialog modal. Pois bem… rodando a aplicação java sozinha e digitando os comandos no console do NetBeans (ou até usando a linha de comando do Windows), tudo acontece às mil maravilhas. Mas, utilizando a aplicação controladora, a tela usando o JDialog simplesmente não aparece.
Percebo que a tela do sistema controlador perde o foco e, se eu teclar ALT+ESPAÇO consigo ver o menu de contexto dessa JDialog. Consigo até mover e alterar o tamanho dela. O fluxo pára esperando que ela se feche. Mas ela simplesmente não aparece.
Alguém teria alguma idéia do que poderia estar acontecendo?
Após criar a janela, você está definindo o tamanho dela com setSize() e a posição com setLocation()?
PauloBrito
É um JDialog criado no NetBeans, e que funciona quando a aplicação é executada em modo de testes, sozinha, como eu disse acima. Portanto a janela funciona. O problema só acontece quando este programa em java é chamado pelo outro programa e fica com stdin e stdout conectados à ele.
Detalhe importante: apensar de eu conseguir mover e alterar o tamanho dela via ALT+ESPACO, o seu conteúdo não aparece. Somente a moldura.
PauloBrito
Nossa, ainda não consegui descobrir a causa deste problema!
PauloBrito
No momento que o setVisible(true) do JDIalog é chamado a thread que o chamou fica aguardando um monitor java.awt.Component$AWTTreeLock e a thread AWT-EventQueue-0 fica aguardando um monitor java.awt.EventQueue.
O janela Debugging do Netbeans diz que não houve nenhum deadlock. Porém a janela não se pinta na tela. Consigo acessá-la via alt+espaço, redimensionar, mudar a posição… se eu fechá-la com alt+f4 o fluxo continua normalmente, como se eu tivesse cancelado a operação no botão cancelar (comportamento padrão dos diálogos do sistema).
Repetindo, isso só acontece se este programa tiver sido chamado de um outro anexando stdin e stdout, como se fosse um pipe. Executando o programa sozinho isso não acontece.
Alguém tem alguma noção do que pode estar acontecendo?
PauloBrito
Resolvi o meu problema… mas não entendi o que acontece.
A solução para o problema foi chamar o constructor do JDialog passando um new JFrame(“tmp”) como parâmetro. Resolveu um problema que não era pra acontecer, já que o comportamento só se revelava quando a aplicação era chamada com stdin e stdout ligados à um aplicativo Delphi. Até onde eu entendi, um new JDialog((Window)null) usava uma janela global compartilhada como pai. Simplesmente não entendi o que tem a ver uma coisa com a outra.