Java: diferença entre os métodos setPreferredSize () e setSize () nos componentes

105

Qual é a principal diferença entre setSize()e setPreferredSize(). Às vezes eu costumava setSize(), às vezes setPreferredSize(), às vezes um faz o que eu quero, às vezes o outro.

Que chamada devo usar para JFrames e JPanels?

David Robles
fonte

Respostas:

116

O uso depende se o pai do componente tem um gerenciador de layout ou não.

  • setSize() - use quando um gerenciador de layout pai não existir;
  • setPreferredSize()(também está relacionado setMinimumSizee setMaximumSize) - use quando existir um gerenciador de layout pai.

O setSize()método provavelmente não fará nada se o pai do componente estiver usando um gerenciador de layout; os lugares isso irá normalmente têm um efeito seria em componentes de nível superior ( JFrames e JWindows) e as coisas que estão dentro de painéis rolado. Você também deve chamar setSize()se tiver componentes dentro de um pai sem um gerenciador de layout.

Geralmente, setPreferredSize()fará o layout dos componentes conforme o esperado se um gerenciador de layout estiver presente; a maioria dos gerenciadores de layout trabalham obtendo os tamanhos preferidos (bem como mínimo e máximo) de seus componentes e, em seguida, usando setSize()e setLocation()posicionando esses componentes de acordo com as regras do layout.

Por exemplo, a BorderLayouttenta fazer com que os limites de sua região "norte" sejam iguais ao tamanho preferido de seu componente norte --- eles podem acabar maiores ou menores que isso, dependendo do tamanho de JFrame, o tamanho dos outros componentes no layout e assim por diante.

Sbodd
fonte
1
Achei que um componente estava usando um gerenciador de layout por padrão (BorderLayout?), Então se eu não definir explicitamente um gerenciador de layout, isso significa que devo usar setSize () em vez de setPreferredSize ()?
David Robles
3
Acredito que JPanels usam BorderLayout por padrão, mas JComponent não tem layout padrão. Na maioria das vezes, é melhor definir um gerenciador de layout se for adicionar algo em vez de usar setSize ().
Sbodd
8
Minha recomendação é sempre usar um gerenciador de layout. SetSize () deve ser pensado como algo que o gerenciador de layout chama - não algo que você chama.
Kevin Day
8
@Sbodd - JPanels têm um FlowLayout por padrão. JFrame.getContentPane () tem um BorderLayout por padrão.
Nemi
10

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

No entanto, se você estiver usando um gerenciador de layout, você pode fornecer dicas para o gerenciador de layout usando setXXXSize()métodos como setPreferredSize()e setMinimumSize()etc.

E certifique-se de que o container do componente usa um gerenciador de layout que respeita o tamanho solicitado. A FlowLayout, GridBagLayoute SpringLayoutos gerentes usam tamanho preferido do componente (os dois últimos, dependendo das limitações que você definiu), mas BorderLayoute GridLayoutgeralmente don't.If você especificar novas sugestões de tamanho para um componente que já está visível, você precisa chamar o método revalidate em para certificar-se de que sua hierarquia de contenção seja apresentada novamente. Em seguida, invoque o método repaint.

Varun
fonte
5

setSize irá redimensionar o componente para o tamanho especificado.

setPreferredSizedefine o tamanho preferido. O componente pode não ter realmente este tamanho, dependendo do tamanho do contêiner em que está ou se o usuário redimensionou o componente manualmente.

Glen
fonte
Você pode mostrar um exemplo completo de setPreferredSize (...). Acho que isso seria útil.
Doug Hauf
4

IIRC ...

setSize define o tamanho do componente.

setPreferredSizedefine o tamanho preferido. O Layoutmanager tentará arranjar tanto espaço para o seu componente.

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

Miku
fonte
e se eu adicionar dois jpanels a um jframe sem especificar um gerenciador de layout explicitamente para o jframe? que método devo usar para definir o tamanho dos jpanels?
David Robles
3
Os painéis de conteúdo usam BorderLayout por padrão ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Portanto, o painel de conteúdo do JFrame tem um LayoutManager, então setPreferredSize deve funcionar.
miku
Parece bom, isso significa que devo usar setSize para o JFrame e setPreferredSize para os componentes internos
David Robles
1
Geralmente, você usaria frame.pack () para tirar proveito do tamanho preferido calculado de todos os componentes filhos. Caso contrário, se você usar frame.setSize () aleatoriamente, os componentes adicionados ao painel de conteúdo irão expandir / contrair para caber no espaço disponível, o que significa que o tamanho preferido de cada componente pode ser substituído.
camickr