Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Swing에서 투명한 JDialog 구현하기 - AlphaContainer 활용법

JDialogDialog 클래스의 하위 클래스로, 일반 프레임과 달리 창 오른쪽 상단에 최소화최대화 버튼이 없습니다. 다이얼로그는 사용자의 입력을 강제하는 모달(Modal) 방식과 그렇지 않은 비모달(Non-modal) 방식 두 가지로 나뉘며, 기본 레이아웃은 BorderLayout입니다.

Java 7 이상에서는 setUndecorated(true)를 호출해 창 장식을 제거한 후 알파 값이 포함된 색상을 배경으로 지정하면 픽셀 단위의 반투명 창을 만들 수 있습니다. 아래 예제에서는 AlphaContainer 클래스를 직접 정의하고 paintComponent() 메서드를 재정의하여 투명한 JDialog를 구현하는 방법을 살펴보겠습니다.

예제 코드

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

public class TransparentDialog {
    public static void main(String[] args) {
        JDialog dialog = new JDialog();
        dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        dialog.getRootPane().setOpaque(false);
        dialog.setUndecorated(true);
        dialog.setBackground(new Color(0, 0, 0, 0));

        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(new Color(0, 0, 0, 64));
        dialog.add(new AlphaContainer(panel));

        JSlider slider = new JSlider();
        slider.setBackground(new Color(255, 0, 0, 32));
        panel.add(new AlphaContainer(slider), BorderLayout.NORTH);

        JButton button = new JButton("레이블 텍스트");
        button.setContentAreaFilled(false);
        panel.add(button, BorderLayout.SOUTH);

        dialog.setSize(400, 300);
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
    }
}

class AlphaContainer extends JComponent {
    private JComponent component;

    public AlphaContainer(JComponent component) {
        this.component = component;
        setLayout(new BorderLayout());
        setOpaque(false);
        component.setOpaque(false);
        add(component);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(component.getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

실행 결과

Java Swing에서 투명한 JDialog 구현하기 - AlphaContainer 활용법

핵심 포인트 정리

1. setUndecorated(true)
제목 표시줄과 테두리를 제거합니다. 투명 배경을 적용하려면 반드시 창이 undecorated 상태여야 합니다.

2. setBackground(new Color(0, 0, 0, 0))
알파 값을 0으로 설정해 다이얼로그 자체를 완전히 투명하게 만듭니다.

3. getRootPane().setOpaque(false)
루트 패널의 불투명 속성을 해제해야 배경색이 비칩니다.

4. AlphaContainer 클래스
JComponent를 상속받아 내부 컴포넌트의 배경색으로 영역을 채우도록 paintComponent()를 재정의합니다. 이때 배경색에 알파 값(예: new Color(0, 0, 0, 64))이 포함되어 있어 반투명 효과가 자연스럽게 적용됩니다.

5. setContentAreaFilled(false)
버튼의 기본 채우기 배경을 끄면 버튼 주변의 투명 효과가 유지됩니다.

이처럼 알파 색상과 커스텀 페인팅을 조합하면 디자인 요구 사항에 맞는 세련된 반투명 다이얼로그를 손쉽게 구현할 수 있습니다.