프로그래밍 언어/JAVA

배치관리자 없는 컨테이너

· 코딩마이데이

배치관리자가 없는 컨테이너가 필요한 경우

모든 컨테이너는 배치관리자를 가지고, 배치관리자가 컴포넌트의 위치와 크기를 결정하도록 하는 것아 자바 GUI의 기본 정신입니다. 배치관리자는 컴포난트를 절대적인 위치에 배치하지 않고, 다른 컴포넌트의 오른쪽이나 아래와 같이 상대적인 위치에 배치합니다. 그러므로 컨테이너의 크기가 변하면 컴포넌트의 위치도 함께 변합니다.

배치 관리자를 사용하면 컴포넌트의 위치에 대해 신경쓰지 않아도 되지만, 한편으로 컴포넌트의 위치를 자동 결정하는 배치관리자가 오히려 불편한 경우들이 종종 있습니다. 

  • 컴포넌트의 크기나 위치를 개발자가 결정하고자 하는 경우
  • 게임 프로그램과 같이 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우
  • 여러 컴포넌트들이 겹치는 효과를 연출하고자 하는 경우

이런 경우, 컨테이너의 배치관리자를 없애고 응용프로그램에서 직접 컴포넌트들의 위치와 크기를 마음대로 설정할 수 있어야 합니다.

 

컨테이너의 배치관리자 제거

Container의 setLayout() 메서드를 이용하여 컨테이너의 배치관리자제거할 수 있습니다.

container.setLayout(null); // container의 배치관리자 제거

 

다음 코드는 JPanel에 현재 부착된 배치관리자를 삭제합니다.

JPanel p = new JPanel();
p.setLayout(null);

 

예를 들면, 다음 코드에서 2개의 버튼은 화면에 전혀 보이지 않습니다.

JPanel p = new JPanel();
p.setLayout(null);

// 배치 관리자가 없으므로 아래 2개의 버튼은 배치되지 않는다.
p.add(new JButton("click")); // 폭과 높이가 0인 상태로 화면에 보이지 않는다.
p.add(new JButtin("mel")); // 폭과 높이가 0인 상태로 화면에 보이지 않는다.

 

컴포넌트의 절대 위치와 절대 크기 설정

배치관리자가 없는 컨테이너에 컴포넌트를 삽입할 때는 응용프로그램에서 컴포넌트의 크기와 위치를 직접 설정해야 합니다. 컴포넌트의 절대 위치와 크기를 설정하기 위해서는 java.awt.Component 클래스의 다음 메서드를 이용합니다.

void setSize(int width, int height) // 컴포넌트를 width x height 크기로 설정
void setLocation(int x, int y) // 컴포넌트의 왼쪽 상단 모서리 좌표를 (x, y)로 설정
void setBounds(int x, int y, int width, int height) // 크기와 위치 동시 설정

 

다음 코드는 버튼을 100x40 크기로 설정하고 JPanel의 (50, 50) 위치에 삽입합니다.

Panel p = new JPanel();
s.setLayout(null); // 패널 p의 배치관리자 제거

JButton clickButton = new JButton("Click"));
clickButton.setSize(100, 40); // 버튼의 크기를 100x40으로 지정
clickButton.setLocation(50, 50); // 버튼의 위치를 (50, 50)으로 지정
p.add(clickButton); // 패널에 버튼 부착. 패널 내 (50, 50) 위치에 100x40 크기의 버튼 출력

 

CardLayout을 제외한 나머지 배치관리자는 컴포넌트들이 서로 겹치지 않도록 배치합니다. 그러나 배치관리자 없는 컨테이너를 만들면 컴포넌트를 절대 위치에 절대 크기로 배치할 수 있기 떄문에 컴포넌트들이 서로 겹치도록 배치할 수 있습니다.

 

배치관리자 없는 컨테이너에 컴포넌트를 절대 위치와 절대 크기로 지정

import javax.swing.*;
import java.awt.*;

public class NullContainersEx extends JFrame {
    public NullContainersEx() {
        setTitle("Null Container Sample"); // 프레임의 타이틀 달기
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 프레임 윈도우를 닫으면 프로그램 종료

        Container c = getContentPane();
        c.setLayout(null); // 컨텐트팬의 배치관리자 제거

        // JLabel 컴포넌트를 생성하고 위치와 크기를 직접 지정한다.
        JLabel la = new JLabel("Hello, Press Buttons!");
        la.setLocation(130, 50); // la를 (130, 50) 위치로 지정
        la.setSize(200, 20); // la를 200x20 크기로 지정
        c.add(la); // la를 컨텐트팬에 부착

        // 9개의 버튼 컴포넌트를 생성하고 모두 동일한 크기로 설정한다.
        // 위치는 서로 다르게 설정
        for (int i = 1; i <= 9; i++) {
            JButton b = new JButton(Integer.toString(i)); // 버튼 생성
            b.setLocation(i * 15, i * 15); // 버튼의 위치 설정
            b.setSize(50, 20); // 9개의 버튼 크기는 동일하게 50x20
            c.add(b);
        }

        setSize(300, 200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new NullContainersEx();
    }
}

 

[실행결과]

 

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

이벤트 기반 프로그래밍  (1) 2025.06.05
여러 컴포넌트를 가진 복잡한 GUI 만들기  (5) 2025.06.02
GridLayout 배치관리자  (1) 2025.05.27
BorderLayout 배치 관리자  (1) 2025.05.24
FlowLayout 배치관리자  (1) 2025.05.21