Java: Diferença entre os methods setPreferredSize () e setSize () em componentes

Ok, eu li a documentação do Java e não consigo descobrir qual é a principal diferença entre esses dois methods. Às vezes eu usei setSize() , às vezes setPreferredSize() , às vezes um faz o que eu quero, às vezes o outro.

Então, qual é a principal diferença entre os dois? Qual deles devo usar para JFrames e JFrames ?

obrigado

A resposta curta é: é complicado.

A resposta um pouco mais longa é: use setSize() se o pai de seu componente não tiver um gerenciador de layout e setPreferredSize() e seus relacionados setMinimumSize e setMaximumSize se houver.

setSize() provavelmente não fará nada se o pai do componente estiver usando um gerenciador de layout; os locais que isso normalmente terá um efeito estariam nos componentes de nível superior ( JFrames e JWindows ) e nas coisas que estão dentro dos scrolled panes . Você também deve chamar setSize() se tiver componentes dentro de um pai sem um gerenciador de layout.

Como regra geral, setPreferredSize() deve fazer a “coisa certa” se você tiver um gerenciador de layout; a maioria dos gerenciadores de layout trabalha obtendo os tamanhos preferidos (assim como mínimo e máximo) de seus componentes e, em seguida, usando setSize() e setLocation() para posicionar esses componentes de acordo com as regras do layout. Então (como um exemplo) um BorderLayout tentará fazer com que os limites de sua região “norte” sejam iguais ao preferred size de seu componente norte – eles podem acabar maiores ou menores que isso, dependendo do tamanho do jframe , o tamanho dos outros componentes no layout e assim por diante.

setSize() ou setBounds() podem ser usados ​​quando nenhum gerenciador de layout está sendo usado.

No entanto, se você estiver usando um gerenciador de layout, poderá fornecer dicas para o gerenciador de layout usando os methods setPreferredSize() como setPreferredSize() e setMinimumSize() etc.

E certifique-se de que o contêiner do componente use um gerenciador de layout que respeite o tamanho solicitado. Os GridBagLayout FlowLayout , GridBagLayout e SpringLayout usam o tamanho preferido do componente (os dois últimos, dependendo das restrições que você definiu), mas BorderLayout e GridLayout normalmente não. Se você especificar novas dicas de tamanho para um componente que já esteja visível, será necessário Invoque o método revalidate para certificar-se de que sua hierarquia de confinamento seja exibida novamente. Em seguida, invoque o método repaint.

setSize resizeá o componente para o tamanho especificado.

setPreferredSize define o tamanho preferido. O componente pode não ter esse tamanho, dependendo do tamanho do container, ou se o usuário redimensionou o componente manualmente.

IIRC …

setSize define o tamanho do componente.

setPreferredSize define o tamanho preferido. O gerenciador de layout tentará organizar esse espaço para o seu componente.

Depende se você está usando um gerenciador de layout ou não …