JAVA

[JAVA] Layout 종류와 사용법

Coding🌱 2024. 10. 12. 00:40
반응형
SMALL

1. BorderLayout

 

BorderLayout은 컴포넌트를 동(EAST), 서(WEST), 남(SOUTH), 북(NORTH), 중앙(CENTER) 다섯 개의 영역에 배치하는 레이아웃입니다.

1-1. BorderLayout 사용 방법

  • new BorderLayout() : 컴포넌트를 기본 가로(수평) 및 세로(수직) 간격 없이 배치합니다.
  • new BorderLayout(가로(수평) 간격, 세로(수직) 간격) : 컴포넌트를 가로 및 세로 간격을 지정하여 배치할 수 있습니다.
 
 
 
JAVA
// BorderLayout 생성
frame.setLayout(new BorderLayout());
 
// 버튼 생성
JButton North_JB = new JButton("NORTH (북쪽)");
JButton South_JB = new JButton("SOUTH (남쪽)");
JButton West_JB = new JButton("WEST (서쪽)");
JButton East_JB = new JButton("EAST (동쪽)");
JButton Center_JB = new JButton("CENTER (중앙)");

// 각 버튼을 BorderLayout의 위치에 추가
frame.add(North_JB, BorderLayout.NORTH);
frame.add(South_JB, BorderLayout.SOUTH);
frame.add(West_JB, BorderLayout.WEST);
frame.add(East_JB, BorderLayout.EAST);
frame.add(Center_JB, BorderLayout.CENTER);

1-2. 컴포넌트 크기 조정 방법

BorderLayout 레이아웃 에서 setPreferredSize를 사용하면 각 컴포넌트의 크기를 세밀하게 지정할 수 있습니다.

 
 
 
JAVA
setPreferredSize(new Dimension(width, height))
  • NORTHSOUTH : 이 영역은 중량 컴포넌트(JFrame, JPanel 등) 의 전체 너비에 맞춰 자동으로 조정됩니다. 따라서 설정한 width 값은 무시되며, height는 사용자가 지정한 값 그대로 반영됩니다. 즉, 이 영역의 높이는 원하는 대로 설정할 수 있지만, 너비는 중량 컴포넌트에 맞춰 자동으로 결정됩니다.
  • WESTEAST : 이 영역은 중량 컴포넌트전체 높이에 맞춰 자동으로 조정됩니다. 따라서 설정한 height 값은 무시되며, width는 사용자가 지정한 값 그대로 반영됩니다. 즉, 이 영역의 너비는 원하는 대로 설정할 수 있지만, 높이는 자동으로 결정됩니다.
  • CENTER : 이 영역은 프레임의 중앙에 위치하며 남은 공간을 모두 차지합니다. 이로 인해 이 영역의 PreferredSize 설정은 무시될 가능성이 큽니다. CENTER의 크기는 주로 주변 영역(NORTH, SOUTH, WEST, EAST)의 크기에 따라 결정되므로, PreferredSize를 설정하더라도 기대한 대로 적용되지 않을 수 있습니다.

1-3. 비어 있는 영역의 처리 방식

 

BorderLayout에서는 CENTER(중앙) 영역을 제외한 NORTH, SOUTH, WEST, EAST 중 하나가 비어 있을 경우, 남는 공간이 자동으로 다른 영역에 확장되어 채워집니다. 하지만 CENTER(중앙) 영역이 비어 있으면 그 공간은 빈 상태로 남습니다.

2. FlowLayout

 

FlowLayout기본적으로 컴포넌트를 좌에서 우로 차례대로 배치하는 레이아웃 매니저입니다. 공간이 부족하면 컴포넌트들은 자동으로 다음 줄로 넘어가게 됩니다. 정렬 방식에 따라 컴포넌트들은 좌측(FlowLayout.LEFT) , 중앙(FlowLayout.CENTER) , 우측(FlowLayout.RIGHT)에 배치되며, 특별히 정렬 방식을 지정하지 않으면 기본적으로 중앙 정렬이 적용됩니다.

2-1. FlowLayout 컴포넌트 정렬 방식

 

FlowLayout에서 컴포넌트의 배치 위치는 정렬 방식에 의해 결정됩니다.

  • FlowLayout.LEFT : 컴포넌트들이 좌측 정렬됩니다.
  • FlowLayout.CENTER : 컴포넌트들이 중앙 정렬됩니다. (기본값)
  • FlowLayout.RIGHT : 컴포넌트들이 우측 정렬됩니다.

2-2. FlowLayout 생성 및 사용 방법

  • new FlowLayout() : 기본 중앙(CENTER)정렬, 가로(수평) 및 세로(수직) 간격 5px로 컴포넌트를 배치합니다.
  • new FlowLayout(정렬 방식) : 지정된 정렬 방식으로 컴포넌트를 배치합니다.
  • new FlowLayout(정렬 방식, 가로 간격, 세로 간격) : 정렬 방식과 함께 가로세로 간격설정할 수 있습니다.
 
 
 
JAVA
// FlowLayout 생성 및 적용
frame.setLayout(new FlowLayout());

// 버튼 생성
JButton JB1 = new JButton("Button 1");
JButton JB2 = new JButton("Button 2");
JButton JB3 = new JButton("Button 3");
JButton JB4 = new JButton("Button 4");
JButton JB5 = new JButton("Button 5");

// 버튼을 프레임에 추가
frame.add(JB1);
frame.add(JB2);
frame.add(JB3);
frame.add(JB4);
frame.add(JB5);

가로 공간이 부족할 경우 컴포넌트를 자동으로 다음 줄로 넘겨 배치합니다. 충분한 공간이 없으면 컴포넌트들이 새로운 줄에 배치됩니다.

2-3. 컴포넌트의 크기 지정 방법

FlowLayout 레이아웃에서 특정 컴포넌트의 크기를 원하는 대로 설정하고 싶을 때 setPreferredSize를 사용할 수 있습니다. 크기를 설정하지 않으면 기본 크기로 배치됩니다.

 
 
 
JAVA
setPreferredSize(new Dimension(width, height))

3. GridLayout

 

GridLayout은 컴포넌트를 가로(행)세로(열)로 이루어진 표에 배치하는 레이아웃 매니저입니다. 모든 셀은 동일한 크기로 자동 조정되며, 개별적으로 크기를 조정할 수는 없지만 지정한 행과 열 수에 따라 컴포넌트가 순서대로 채워집니다. 만약 설정된 그리드보다 더 많은 컴포넌트가 추가되면, 열의 수는 고정된 채 행이 자동으로 늘어나며 모든 컴포넌트가 배치됩니다. 따라서 공간이 부족해도 컴포넌트가 무시되지 않고 그리드가 확장됩니다.

3-1. GridLayout 사용 방법

  • new GridLayout(행(row), 열(column)) : 지정한 행과 열의 개수로 컴포넌트를 격자 형태로 배치합니다.
  • new GridLayout(행(row), 열(column), 가로(수평) 간격, 세로(수직) 간격) : 각 셀 사이의 가로(수평)세로(수직) 간격을 설정하여 여백을 추가할 수 있습니다.
 
 
 
JAVA
// GridLayout 생성 및 적용
frame.setLayout(new GridLayout(행(row), 열(column)));

// 버튼 생성
JButton JB1 = new JButton("Button 1");
JButton JB2 = new JButton("Button 2");
JButton JB3 = new JButton("Button 3");
JButton JB4 = new JButton("Button 4");
JButton JB5 = new JButton("Button 5");

// 버튼을 프레임에 추가
frame.add(JB1);
frame.add(JB2);
frame.add(JB3);
frame.add(JB4);
frame.add(JB5);

GridLayout모든 셀이 동일한 크기로 유지되기 때문에, 개별 셀의 크기를 따로 설정할 수 없습니다. 또한, 지정된 행과 열보다 많은 컴포넌트를 추가하면 공간이 부족할 경우 컴포넌트는 추가되지 않고 무시됩니다.

3-2. GridLayout 행과 열 설정 규칙

GridLayout에서는 동시에 행과 열에 0을 넣을 수는 없으며, 반드시 하나는 1 이상의 값을 가져야 합니다.

  • 행(row)이 0일 경우 : 컴포넌트를 추가할 때마다 행이 자동으로 늘어나고, 열은 고정됩니다.
  • 열(column)이 0일 경우 : 컴포넌트를 추가할 때마다 열이 자동으로 늘어나고, 행은 고정됩니다.

3-3. 컴포넌트 크기 지정 방법

GridLayout에서 각 컴포넌트의 크기는 setPreferredSize() 메서드를 사용하여 세밀하게 지정할 수 있습니다. 하지만, 기본적으로는 모든 셀이 동일한 크기로 자동 조정되며, 개별적으로 크기를 지정하는 것은 무시됩니다.

  • 여러 컴포넌트의 크기를 다르게 설정해도 GridLayout은 각 셀을 동일한 크기로 맞추므로, 설정한 크기는 무시되고 모든 컴포넌트는 동일한 크기로 조정됩니다. 이는 GridLayout이 전체 레이아웃의 공간을 균등하게 분배하기 때문입니다.
  • 한 개의 컴포넌트의 크기만 설정할 경우, 해당 크기는 무시되고 모든 컴포넌트의 크기는 기본 크기로 유지됩니다.
 
 
 
JAVA
setPreferredSize(new Dimension(width, height))

4. BoxLayout

BoxLayout은 컴포넌트를 수평(BoxLayout.X_AXIS) 또는 수직(BoxLayout.Y_AXIS)으로 나열하는 레이아웃 매니저입니다. 이를 JFrame에 적용할 때는 반드시 frame.getContentPane()을 사용해야 합니다. 이는 JFrame이 내부적으로 contentPane이라는 컨테이너를 가지고 있기 때문이며, BoxLayout은 해당 컨테이너를 참조해야만 정상적으로 동작합니다. 반면에, FlowLayout, BorderLayout, GridLayout 같은 다른 레이아웃 매니저는 별도의 컨테이너 참조 없이 JFrame에 바로 설정할 수 있습니다.

4-1. BoxLayout 사용 방법

 
 
 
JAVA
new BoxLayout(중량 컴포넌트, 정렬 방향);
  • 중량 컴포넌트 : BoxLayout을 적용할 대상이 되는 Container 객체입니다. 일반적으로 JPanel, JFrame 등과 같은 Swing 컴포넌트를 사용합니다. 이 컴포넌트의 자식 요소들이 정렬됩니다.
  • 정렬 방향 : 컴포넌트를 어떻게 정렬할지를 지정하는 상수입니다.
    • BoxLayout.X_AXIS : 컴포넌트를 수평 방향(왼쪽에서 오른쪽)으로 정렬합니다.
    • BoxLayout.Y_AXIS : 컴포넌트를 수직 방향(위에서 아래)으로 정렬합니다.
 
 
 
JAVA
// BoxLayout 생성 및 적용
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));

// 버튼 생성
JButton JB1 = new JButton("Button 1");
JButton JB2 = new JButton("Button 2");
JButton JB3 = new JButton("Button 3");
JButton JB4 = new JButton("Button 4");
JButton JB5 = new JButton("Button 5");

// 버튼을 프레임에 추가
frame.add(JB1);
frame.add(JB2);
frame.add(JB3);
frame.add(JB4);
frame.add(JB5);

4-2. 컴포넌트 정렬(Alignment) 설정 방법

BoxLayout은 컴포넌트들을 한 방향(수평 또는 수직)으로 배치하는 레이아웃 매니저입니다. 컴포넌트는 정렬(Alignment) 속성을 사용해 배치 방향에 따라 위치를 세밀하게 조정할 수 있습니다.

 
 
 
JAVA
/* 
 * Component.LEFT_ALIGNMENT : 좌측
 * Component.CENTER_ALIGNMENT : 중앙
 * Component.RIGHT_ALIGNMENT : 우측
 */
setAlignmentX();  // 컴포넌트의 수평 정렬
/*
 * Component.TOP_ALIGNMENT : 상단
 * Component.CENTER_ALIGNMENT : 중앙
 *Component.BOTTOM_ALIGNMENT : 하단
 */
setAlignmentY();  // 컴포넌트의 수직 정렬

4-3. 컴포넌트 크기 지정 방법

컴포넌트의 크기 지정은 경량 컴포넌트중량 컴포넌트에 따라 다르게 처리해야 합니다.

  • 경량 컴포넌트 (JButton, JLabel 등)

경량 컴포넌트는 자체 레이아웃이 없고 부모 컨테이너에 의해 크기가 자동으로 조정되기 때문에, setMaximumSize만 설정해도 원하는 크기로 제한할 수 있습니다.

 
 
 
JAVA
setMaximumSize(new Dimension(width, height));
  • 중량 컴포넌트 (JPanel, JFrame 등)

중량 컴포넌트는 다른 컴포넌트를 포함하고 레이아웃을 관리하기 때문에, 원하는 크기로 고정하려면 setPreferredSize, setMaximumSize, setMinimumSize모두 설정해야 합니다.

 
 
 
JAVA
setPreferredSize(new Dimension(width, height));  
setMaximumSize(new Dimension(width, height));    
setMinimumSize(new Dimension(width, height));

4-4. 컴포넌트 사이에 간격을 생성하는 방법

BoxLayout에서는 가변적인 공간고정된 크기의 공간을 추가해 컴포넌트 사이의 간격을 설정할 수 있습니다.

  • 가변적인 공간(Glue) 생성 방법

컴포넌트 사이에 빈 공간이 생기며 여유 공간이 균등하게 나눠져 각 컴포넌트 사이에 균형 잡힌 여유 공간이 유지됩니다. 또한, 컴포넌트와 프레임이 커지면 여유 공간이 자동으로 균등하게 나눠집니다.

 
 
 
JAVA
Box.createHorizontalGlue()    // 수평
Box.createVerticalGlue()      // 수직
  • 고정된 크기의 공간(Rigid Area) 생성 방법

고정된 크기의 공간은 일정한 간격을 정확하게 두고 싶을 때 유용합니다. 여러 컴포넌트 사이에 고정된 간격을 둘 수 있으며, 이 간격은 창 크기나 컴포넌트 크기에 영향을 받지 않고 항상 일정하게 유지됩니다.

 
 
 
JAVA
Box.createRigidArea(new Dimension(width, height))

5. Null Layout

 

Null Layout은 컴포넌트의 위치와 크기를 개발자가 직접 지정할 수 있는 레이아웃 매니저입니다. 자동 배치 기능이 없기 때문에, 각 컴포넌트의 크기와 위치를 수동으로 설정해야 합니다. 이를 통해 자유로운 배치가 가능하지만, 창 크기가 변경될 때 컴포넌트들이 자동으로 재배치되지 않는 단점이 있습니다.

 
 
 
JAVA
frame.setLayout(null);

JButton button1 = new JButton("Button 1");
button1.setBounds(X, Y, width, height);

JButton button2 = new JButton("Button 2");
button2.setBounds(X, Y, width, height);

JButton button3 = new JButton("Button 3");
button3.setBounds(X, Y, width, height);

JButton button4 = new JButton("Button 4");
button4.setBounds(X, Y, width, height);

JButton button5 = new JButton("Button 5");
button5.setBounds(X, Y, width, height);

frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);

Null Layout을 사용할 때, setBounds()로 컴포넌트의 위치와 크기를 명시적으로 설정하지 않으면, add()만으로는 컴포넌트가 화면에 표시되지 않습니다. 이는 Null Layout이 자동으로 컴포넌트의 배치나 크기를 조정하지 않기 때문입니다.

반응형
LIST