MDI: JInternalFrame vs. JDialog

Pessoal,

Estou CLONANDO o post que fiz no JavaFree ( http://www.javafree.org/javabb/viewtopic.jbb?t=871176 ) para ver se consigo atingir um número maior de usuários, facilitando assim a possibilidade de resolver este problema.

Estou desenvolvendo uma aplicação MDI em Java utilizando o NetBeans e estou trancado em um ponto talvez bastante simples, mas não consegui identificar uma solução até o momento.

A aplicação conta com um JFrame principal, um JMenuBar e um JDesktopPane. Ao chamar o cadastro de clientes, implemento um JInternalFrame que abre dentro do JDesktopPane. Ate aqui, beleza.

Na tela de cadastro de clientes, existem várias opções de cadastro das quais algumas tem a necessidade de abrir outro Frame qualquer ( seja ele JInternal, JDialog ). O que acontece?

Preciso que todas as janelas sejam abertas dentro do JDesktopPane para manter a linha do MDI. Consegui fazê-lo com sucesso repassando ao constructor do JInternalFrame um herança de desktop, mas agora me surgiu a necessidade de as janelas “filhas” deste JInternalFrame serem do tipo Modal ( uma vez aberta, o usuário precisa encerra-las para continuar utilizando a aplicação ).

Assim, considerei utilizar o JDialog ( que atende estes requisitos com sucesso ), entretanto, os JDialogs não respeitam o JDesktopPane ( é possível movê-los para qualquer ponto fora da área de trabalho do sistema ) o que descaracteriza a aplicação MDI.

Existem muitos exemplos de aplicação MDI espalhados na rede, mas todos se restringem a 1 JFrame Principal e 1 JInternalFrame, não consegui encontrar nada explorando a abertura de janelas dentro de janelas, dentro de janelas, dentro de janelas.

Tudo reportado detalhadamente, minha pergunta é:

Como posso associar estes JDialogs ao JDesktopPane do Frame Principal se é que isto é possível. Existe alguma outra solução que possa ser utilizada que atenda a estes requisitos?

Olá
Na comunidade Delphi, muita gente quer a mesma coisa… Usar uma tela modal com aparência de MDI. O problema é que MDI não foi feito pra ser modal.

Negativo… Uma área de trabalho só é necessária quando você pode alternar entre documentos. Se uma janela é modal, então ela não está - nem deve estar - na área de trabalho. Descaracterizar o MDI é forçar isso. A funcionalidade MDI não está restrita ao visual, que é ao que você está se apegando. MDI é útil quando você quer que o usuário possa editar vários documentos simultaneamente.

Não reme contra a maré, se for possível fazer isso deve dar muito trabalho. Aceite que janelas modais não devem ter aparência de MDI, até porque o cliente pode querer alternar a janela, já que visualmente ela aparenta ser alternável.

tnaires, antes de prosseguir, obrigado pela resposta.

Imagine a situação.

Um JInternalFrame de cadastro de clientes. Dentro deste tenho uma opção ( dentre várias outras ) que é permitir que o usuário importe um determinado cep que já consulta logradouro, endereço, bairro, etc… Para não carregar todos os ceps dentro de um JComboBox ( que ficaria imenso ), dou ao usuário a facilidade de ao clicar um JButton chamar um JDialog ou JInternalFrame com todos os CEPS que uma vez encerrado retorna o cep escolhido. Dentro deste JDialog ainda posso dar direito a ele de chamar OUTRO JDialog ou JInternalFrame para cadastrar um novo cep, e dentro deste novo cep ainda posso dar o direito de ele cadastrar os tipos de logradouro ( chamando outro Frame )… No caso o sistema opera em modo cascata, visando facilitar a vida do usuário.

Imagine o usuário chegar no último passo com 5 JInternalFrames aberto se ele tiver a opção de trabalhar com um formulario que nao seja modal ( vai ficar pulando de um frame para o outro, esconder as janelas, enfim, vai se perder ). Assim, penso que o JDialog é o melhor caminho, pois se ele abrir o cadastro de Ceps, só vai continuar o processo de cadastro do cliente quando fechar este JDialog.

A questão lógica está bem definida, o que ocorre é que a parte estética não está de acordo.

Se o usuário não estiver utilizando a aplicação em tela cheia, ao chegar num determinado cadastro que for JDialog ele vai poder arrastar o JDialog para fora da aplicação e foi aqui que “me caiu os butiá do bolso”.

Preciso dar um jeito de enquadrar este JDialog na área de trabalho do sistema, ou descobrir uma outra forma de seguir esta idéia. Como JInternalFrame não possui a opção de ser Modal não quero partir para gambiarras como manter um JInternalFrame “AllwaysOnTop”, ou entao criar um JOptionPane Modal e colocar o JInternalFrame dentro.

A busca continua.

sds.

[quote=vhprice]Um JInternalFrame de cadastro de clientes. Dentro deste tenho uma opção ( dentre várias outras ) que é permitir que o usuário importe um determinado cep que já consulta logradouro, endereço, bairro, etc… Para não carregar todos os ceps dentro de um JComboBox ( que ficaria imenso ), dou ao usuário a facilidade de ao clicar um JButton chamar um JDialog ou JInternalFrame com todos os CEPS que uma vez encerrado retorna o cep escolhido. Dentro deste JDialog ainda posso dar direito a ele de chamar OUTRO JDialog ou JInternalFrame para cadastrar um novo cep, e dentro deste novo cep ainda posso dar o direito de ele cadastrar os tipos de logradouro ( chamando outro Frame )… No caso o sistema opera em modo cascata, visando facilitar a vida do usuário.

Imagine o usuário chegar no último passo com 5 JInternalFrames aberto se ele tiver a opção de trabalhar com um formulario que nao seja modal ( vai ficar pulando de um frame para o outro, esconder as janelas, enfim, vai se perder ). Assim, penso que o JDialog é o melhor caminho, pois se ele abrir o cadastro de Ceps, só vai continuar o processo de cadastro do cliente quando fechar este JDialog.

A questão lógica está bem definida, o que ocorre é que a parte estética não está de acordo.[/quote]
Concordo com tudo aqui. É exatamente assim que construo meus sistemas desktop.

[quote=vhprice]Se o usuário não estiver utilizando a aplicação em tela cheia, ao chegar num determinado cadastro que for JDialog ele vai poder arrastar o JDialog para fora da aplicação e foi aqui que “me caiu os butiá do bolso”.

Preciso dar um jeito de enquadrar este JDialog na área de trabalho do sistema, ou descobrir uma outra forma de seguir esta idéia. Como JInternalFrame não possui a opção de ser Modal não quero partir para gambiarras como manter um JInternalFrame “AllwaysOnTop”, ou entao criar um JOptionPane Modal e colocar o JInternalFrame dentro.[/quote]
Realmente, ele vai poder jogar o JDialog pra fora da aplicação… Apesar disso, ele não vai poder utilizar as janelas que estiverem atrás, porque o JDialog é modal.
O meu ponto é esse: você está se apegando a uma questão estética que, na minha opinião, não vale a pena se desgastar. Passei pelo mesmo problema quando comecei a programar em Delphi - MDI é MDI independente da tecnologia - mas resolvi deixar pra lá, dada a pouca relevância da questão.

Enfim, boa sorte na busca.