Java : 구성 요소에서 setPreferredSize () 및 setSize () 메서드의 차이점


105

사이의 주요 차이점은 무엇입니까 setSize()setPreferredSize(). 때때로 나는 setSize(), 때로는 setPreferredSize(), 때로는 하나는 내가 원하는 것을, 때로는 다른 하나를 사용했습니다.

JFrames와 JPanels에 어떤 호출을 사용해야 합니까?

답변:


116

사용법은 구성 요소의 부모에 레이아웃 관리자가 있는지 여부에 따라 다릅니다.

  • setSize() -부모 레이아웃 관리자가 없을 때 사용합니다.
  • setPreferredSize()(또한 관련 setMinimumSizesetMaximumSize)-상위 레이아웃 관리자가있을 때 사용합니다.

setSize()메서드는 구성 요소의 부모가 레이아웃 관리자를 사용하는 경우 아무 작업도 수행하지 않을 것입니다. 이것이 일반적으로 영향을 미치는 위치는 최상위 구성 요소 ( JFrameJWindows) 및 스크롤 된 창 내부에있는 것입니다. setSize()레이아웃 관리자없이 부모 내부에 구성 요소가있는 경우 에도 호출해야합니다 .

일반적으로 setPreferredSize()레이아웃 관리자가있는 경우 예상대로 구성 요소를 레이아웃합니다. 대부분의 레이아웃 매니저가 선호를 받고 (물론 최소 및 최대)에 의해 작동 후 사용하여 구성 요소의 크기 setSize()setLocation()레이아웃의 규칙에 따라 해당 구성 요소를 배치 할 수 있습니다.

예를 들어, BorderLayout"북쪽"영역의 경계를 북쪽 구성 요소의 기본 크기와 같게 만들려고하면 JFrame, 다른 구성 요소 의 크기에 따라 그보다 더 크거나 작아 질 수 있습니다. 레이아웃, 등등.


1
구성 요소가 기본적으로 레이아웃 관리자 (BorderLayout?)를 사용한다고 생각 했으므로 레이아웃 관리자를 명시 적으로 설정하지 않으면 setPreferredSize () 대신 setSize ()를 사용해야합니까?
David Robles

3
JPanels는 기본적으로 BorderLayout을 사용한다고 생각하지만 JComponent에는 기본 레이아웃이 없습니다. 대부분의 경우 setSize ()를 사용하는 대신 무언가를 추가 할 경우 레이아웃 관리자를 설정하는 것이 좋습니다.
Sbodd

8
내 권장 사항은 항상 레이아웃 관리자를 사용하는 것입니다. SetSize ()는 레이아웃 관리자가 호출하는 것이 아니라 호출하는 것으로 생각해야합니다.
Kevin Day

8
@Sbodd-JPanel에는 기본적으로 FlowLayout이 있습니다. JFrame.getContentPane ()에는 기본적으로 BorderLayout이 있습니다.
Nemi 2009.11.25

10

setSize()또는 setBounds()레이아웃 관리자가 사용되지 않을 때 사용할 수 있습니다.

당신이 레이아웃 매니저를 사용하는 경우, 당신은 사용하는 레이아웃 매니저에 대한 힌트를 제공 할 수 있습니다 setXXXSize()와 같은 방법 setPreferredSize()setMinimumSize()

그리고 컴포넌트의 컨테이너가 요청 된 크기를 준수하는 레이아웃 관리자를 사용하는지 확인하십시오. FlowLayout, GridBagLayoutSpringLayout관리자는 구성 요소의 적절한 사이즈 (제약 조건이 설정에 따라 후자의 두),하지만를 사용 BorderLayout하고 GridLayout, 당신이에 재 검증 메소드를 호출 할 필요가 일반적으로 보시죠 제발 애야 이러지 아직 표시의 구성 요소에 대한 새로운 크기 힌트를 지정 포함 계층 구조가 다시 배치되었는지 확인합니다. 그런 다음 repaint 메서드를 호출합니다.


5

setSize 구성 요소의 크기를 지정된 크기로 조정합니다.

setPreferredSize선호하는 크기를 설정합니다. 구성 요소는 포함 된 컨테이너의 크기에 따라 또는 사용자가 구성 요소의 크기를 수동으로 조정 한 경우 실제로이 크기가 아닐 수 있습니다.


setPreferredSize (...)의 전체 예제를 보여줄 수 있습니까? 이것이 도움이 될 것이라고 생각합니다.
Doug Hauf 2014

4

IIRC ...

setSize 구성 요소의 크기를 설정합니다.

setPreferredSize선호하는 크기를 설정합니다. Layoutmanager는 구성 요소에 대해 그 정도의 공간을 배치하려고합니다.

레이아웃 관리자를 사용하는지 여부에 따라 다릅니다.


jframe에 대한 레이아웃 관리자를 명시 적으로 지정하지 않고 jframe에 두 개의 jpanel을 추가하면 어떻게됩니까? jpanel의 크기를 설정하려면 어떤 방법을 사용해야합니까?
David Robles

3
컨텐츠 창은 기본적으로 BorderLayout을 사용합니다 ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). 따라서 JFrame의 콘텐츠 창에는 LayoutManager가 있으므로 setPreferredSize 작동합니다 ..
miku

사운드 좋은, 나는 내부의 구성 요소에 대한 JFrame의 및 setPreferredSize위한에는 setSize을 사용한다는 것을 의미
데이비드 로블레스

1
일반적으로 모든 하위 구성 요소의 계산 된 선호 크기를 활용하려면 frame.pack ()을 사용합니다. 그렇지 않으면 frame.setSize ()를 임의로 사용하는 경우 콘텐츠 창에 추가 된 구성 요소가 사용 가능한 공간에 맞게 확장 / 축소되므로 각 구성 요소의 기본 크기가 재정의 될 수 있습니다.
camickr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.