2009-11-23 5 views
89

자, Java 설명서를 읽었으므로이 두 메소드 간의 주요 차이점을 알아낼 수 없습니다. 때로는 setSize()을 사용하고 때로는 setPreferredSize()을 사용합니다. 때로는 내가 원하는 것을, 때로는 다른 것을 사용합니다.Java : 구성 요소의 setPreferredSize() 및 setSize() 메소드의 차이점

두 가지의 주요 차이점은 무엇입니까? 어느 하나를 JFramesJPanels에 사용해야합니까?

감사

답변

105

짧은 대답은 ... 당신이 레이아웃 매니저 여부를 사용하는지 여부에 따라 달라집니다 : 그것은 복잡.

경미하게 더 이상 대답은 : 구성 요소의 부모가 관련 setMinimumSizesetMaximumSize는 않는 경우가 더 레이아웃 매니저이 없으며, setPreferredSize() 및 경우 setSize()를 사용합니다.

setSize()은 구성 요소의 부모가 레이아웃 관리자를 사용하고 있다면 아무 것도하지 않습니다. 일반적으로 영향을 줄 장소는 최상위 구성 요소 (JFramesJWindows)와 내부에있는 내용이 scrolled panes입니다. 또한 레이아웃 관리자가없는 부모 내에 구성 요소가있는 경우 setSize()으로 전화해야합니다.

일반적으로 setPreferredSize()은 레이아웃 관리자가 있으면 '옳은 일'을 수행해야합니다. 대부분의 레이아웃 관리자는 구성 요소의 기본 크기 (최소 및 최대)를 얻은 다음 setSize()setLocation()을 사용하여 레이아웃의 규칙에 따라 해당 구성 요소를 배치합니다. 따라서 (예를 들어) BorderLayout은 북쪽 구성 요소의 preferred size과 동일한 "북쪽"영역의 경계를 만들려고합니다. jframe의 크기에 따라 북쪽 구성 요소의 크기가 더 크거나 작아 질 수 있습니다. 레이아웃의 다른 구성 요소 등.

+1

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

+3

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

+8

항상 레이아웃 관리자를 사용하는 것이 좋습니다. SetSize()는 레이아웃 관리자가 호출하는 것으로 생각해야합니다. 사용자가 호출하는 것이 아닙니다. –

5

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

setPreferredSize이 바람직한 크기를 설정합니다. 구성 요소는 실제로 들어있는 컨테이너의 크기 나 사용자가 구성 요소의 크기를 수동으로 조정 한 경우 실제로이 크기가 아닐 수 있습니다.

+0

setPreferredSize (...)의 전체 예제를 표시 할 수 있습니까? 나는 이것이 도움이 될 것이라고 생각한다. –

4

IIRC ...

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

setPreferredSize이 바람직한 크기를 설정합니다. LayoutManager는 구성 요소에 충분한 공간을 마련하려고 시도합니다.

+0

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

+3

내용 창은 기본적으로 BorderLayout을 사용합니다 (http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html). 따라서 JFrame의 contentpane에는 LayoutManager가 있으므로 setPreferredSize _should_ work가됩니다. – miku

+0

좋은 소리는 JFrame에 setSize를 사용하고 내부에 구성 요소에 setPreferredSize를 사용해야한다는 것을 의미합니다. –

9

setSize() 또는 setBounds()은 레이아웃 관리자를 사용하지 않을 때 사용할 수 있습니다. 당신이 레이아웃 매니저를 사용하는 경우

그러나, 당신은 등 setPreferredSize()setMinimumSize()

처럼 setXXXSize() 방법을 사용하여 레이아웃 매니저에 대한 힌트를 제공하고 구성 요소의 컨테이너가 요청 존중하는 레이아웃 매니저를 사용하는 확신 할 수 있습니다 크기.FlowLayout, GridBagLayoutSpringLayout 관리자는 구성 요소의 기본 크기 (사용자가 설정 한 제약 조건에 따라 후자 두 개)를 사용하지만 일반적으로 표시되지 않는 BorderLayoutGridLayout입니다. 이미 표시된 구성 요소에 대한 새 크기 힌트를 지정하면 다음을 수행해야합니다. revalidate 메소드를 호출하여 포함 계층 구조가 다시 배치되었는지 확인하십시오. 그런 다음 repaint 메소드를 호출하십시오.

관련 문제