JFrame, JDialog, JInternalFrame - Quando usar cada uma?

Colegas,

Em que situação usar JFrame, JInternalFrame ou JDialog?

Muito obrigado,

Marques

JFrame - Uma janela comum.
JDialog - Use geralmente para janelas modais. Idealmente, um JDialog não deve manipular classes de negócio diretamente. Deve só requisitar valor e devolver o valor lido.
JInternalPanel - Substitui os JFrames no caso de aplicações MDI. Ou seja, use-o quando você quiser que um Frame seja aberto dentro de outro Frame.

deixa eu ver se entendi,
um JFrame não pode ser modal?
sem ser MDI só o JDialog q devo usar pra forms modais?

Sim.

A classe JOptionPane até tem alguns forms MDI modais, mas foram implementados através de comandos obscuros da API, e só funcionam lá.

Então, tava precisando um dia desses de um JInternalFrame modal, ae busquei e encontrei umas implementações, mas todas me pareceram gambi, inclusive encontrei uma no site da propria Sun, mas não me senti bem e acabei nem usando. ViniGodoy o sr. não sabe alguma maneira de implementar um frame interno sem parecer gambiarra, o que eu precisaria saber para implementar algo do tipo?

Não use JDesktopPane nem JInternalFrame, a menos que você saiba exatamente o que está fazendo. A maior parte dos programas atuais não usa mais o esquema MDI por default. Use um JTabbedPane e/ou layout CardLayout.

Beleza, mas por que é desaconselhavel a utilização de MDI? Baixa performace, usabilidade, baixa manutenbilidade… enfim… qual o motivo? É que desenvolvo um sistema na empresa em que trabalho, e utilizo MDI e queria saber qual os problemas pra ir logo me precavendo.

Todos esses motivos. Além do fato de não existir MDI modal. Só com xunxo mesmo. Coisas como desenhar um glasspane sobre o painel debaixo. Olha, eu tentei várias alternativas, nenhuma delas funciona 100%.

O que você pode fazer (e foi o que fiz) é deixar um JDialog com “cara” de MDI, alterando as propriedades dela. Ela ainda flutuará sobre o JFrame, mas pelo menos fica com uma aparência mais padrão. Não me lembro de cabeça como faz isso, mas posso verificar, se você quiser.

To passando uma aplicação em delphi pra java

vou ter q fazer o formulario de entrada de dados em JDialog pois tem q ser modal

fiz com JPanel mais o formulário JPanel não tem a propriedade resizable

e eu preciso q ela seja false

ta certo eu usar o JDialog pro formulário q deve ser modal, e principal da aplicação?

Se tem que ser modal, sim.

Se você poder verificar pra min, eu agradeço muito.


Você ainda pode setar uma dessas decorações, além de FRAME:
NONE, PLAIN_DIALOG, INFORMATION_DIALOG, ERROR_DIALOG, COLOR_CHOOSER_DIALOG, FILE_CHOOSER_DIALOG, QUESTION_DIALOG, ou WARNING_DIALOG.

Você ainda pode setar uma dessas decorações, além de FRAME:
NONE, PLAIN_DIALOG, INFORMATION_DIALOG, ERROR_DIALOG, COLOR_CHOOSER_DIALOG, FILE_CHOOSER_DIALOG, QUESTION_DIALOG, ou WARNING_DIALOG.