OverlayLayout이란?
- OverlayLayout은 Object 클래스를 기반으로 하는 스윙(Swing) 레이아웃 관리자로, 여러 컴포넌트를 서로 겹쳐 쌓듯이 배치하고 각 컴포넌트에 지정된 정렬(alignment) 값을 기준으로 상대적인 위치를 결정합니다.
- 컴포넌트마다 서로 다른 크기를 지정하면, 크기가 작은 컴포넌트가 큰 컴포넌트 위에 겹쳐 있더라도 모든 컴포넌트를 화면에서 확인할 수 있습니다.
- 컴포넌트를 다른 컴포넌트 위 또는 프레임 내 원하는 위치에 정렬하려면 setAlignmentX()와 setAlignmentY() 메서드를 사용합니다. 매개변수는 0.0f부터 1.0f 사이의 float 값이며, OverlayLayout은 기본적으로 최대값인 1.0f를 사용합니다.
- OverlayLayout의 주요 메서드로는 addLayoutComponent(), getTarget(), invalidateLayout(), maximumLayoutSize() 등이 있습니다.
사용 시 주의할 점
OverlayLayout을 올바르게 동작시키려면 컴포넌트가 겹칠 수 있음을 스윙에게 알려주어야 합니다. 이를 위해 패널에서 isOptimizedDrawingEnabled() 메서드를 오버라이드하여 false를 반환하도록 설정해야 하며, 그렇지 않으면 화면이 제대로 갱신되지 않을 수 있습니다.
예제 코드
import java.awt.*;
import javax.swing.*;
import javax.swing.OverlayLayout;
public class OverlayLayoutTest extends JFrame {
public OverlayLayoutTest() {
setTitle("OverlayLayout Test");
JPanel panel = new JPanel() {
public boolean isOptimizedDrawingEnabled() {
return false;
}
};
LayoutManager overlay = new OverlayLayout(panel);
panel.setLayout(overlay);
JButton button = new JButton("Small");
button.setMaximumSize(new Dimension(75, 50));
button.setBackground(Color.white);
panel.add(button);
button = new JButton("Medium Btn");
button.setMaximumSize(new Dimension(125, 75));
button.setBackground(Color.lightGray);
panel.add(button);
button = new JButton("Large Button");
button.setMaximumSize(new Dimension(200, 100));
button.setBackground(Color.orange);
panel.add(button);
add(panel, BorderLayout.CENTER);
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
new OverlayLayoutTest();
}
}실행 결과
위 코드를 실행하면 크기가 서로 다른 세 개의 버튼(Small, Medium Btn, Large Button)이 지정된 정렬 값에 따라 중앙을 기준으로 겹쳐진 형태로 표시됩니다. 가장 큰 버튼이 아래에 깔리고, 작은 버튼들이 그 위에 순차적으로 배치되어 OverlayLayout의 겹침 배치 특성을 직관적으로 확인할 수 있습니다.
