Diferença visual entre a preview e a execução de telas Swing

Olá pessoal! Tenho uma dúvida a respeito da diferença visual existente em certos componentes do Java Swing. Já li outras postagens que comentavam sobre mas, infelizmente, não cheguei num entendimento.

Por exemplo, quando criamos um projeto com JDialog e adicionamos um JPanel pela própria paleta padrão da IDE (que no caso é o NetBeans), ao editar suas propriedades de tamanho na visualização do design percebemos de uma forma, enquanto que na execução aparece de outra.

No exemplo abaixo o JDialog tem 400X500px e o JPanel tem 350X450xp:

Reparem que na imagem 1 as bordas estão cada uma com 50px, como era de se esperar mas, na execução (imagem 2) do projeto elas são “deformadas”. Porquê isso acontece? Como evitar? O que isso tem a ver com o look and feel do JDialog?

P.S.: Ignorem a questão das cores de fundo.

Eu não entendi exatamente o que ficou deformado

Acredito que o editor do NetBeans só renderiza o preview de seus componentes dentro de um JPanel, mas ao executar você tem um JFrame.

Se você somar o espaço ocupado pela barra de título do JFrame, com o espaço que ficou reduzido da sua borda, provavelmente vai completar os 50px que você esperava.

1 curtida

@rodriguesabner Repare nas bordas fora do painel na cor ciano. Na primeira imagem tanto a borda lateral direita como a inferior tem 50px, enquanto que na segunda a borda inferior dá uma diminuída. Isso acontece não só com com JFrames ou JDialogs.

É por causa do Look and Feel. O NetBeans atualmente usa o FlatLaf no editor e na execução (no código do main do JFrame) o Nimbus. Se a execução for feita sem setar o Look and Feel, o padrão é o Metal. Para ter uma relação 1 pra 1, vc precisa rodar o NetBeans no Look and Feel que você está usando na sua implementação. Para fazer isso, o caminho é Tools → Options → Appearance → Look and Feel → Preferred Look and Feel

De fato! retirando a barrinha o frame vai para o tamanho correto. Estranho eu ter que calcular também o tamanho da barra de título. Além dessa solução, nas propriedades do JDialog achei a opção automática de “Gerar Código de Redimensionamento” que calcula e gera um setSize(new java.awt.Dimension(x, y)); com as dimensões adequadas.

Li bastante sobre o tal do Look and Feel mas não entendi direito. Isso se faz necessário toda vez que eu for usar o editor Swing no NetBeans? Acho estranho eu ter que mudar a aparência de toda a minha IDE quando precisar usar Swing. Tem outras maneiras mais práticas?

Você não precisa mudar nada. Se souber o que está fazendo, principalmente usando os gerenciadores de layout apropriadamente, sua GUI sempre estará organizada.

1 curtida