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

Java BorderFactory로 다양한 테두리(Border) 구현하는 방법

BorderFactory는 Java Swing에서 다양한 유형의 테두리(Border) 객체를 간편하게 생성해 주는 팩토리(Factory) 클래스입니다. 개발자가 테두리 클래스를 직접 인스턴스화하지 않아도 되므로 코드가 간결해지고 가독성이 크게 향상됩니다.

주요 테두리 종류

  • BevelBorder: 입체적인 느낌을 주기 위해 올라간(raised) 또는 내려간(lowered) 사선 모서리를 그립니다.
  • EmptyBorder: 아무것도 그리지 않지만 여백으로서 공간을 차지합니다. 컴포넌트 주변에 빈 공간을 두고 싶을 때 사용합니다.
  • EtchedBorder: Lowered(내려간) 상태에서는 사각형 홈이 파인 듯한 모습을, Raised(올라간) 상태에서는 화면 표면이 솟아 오른 듯한 효과를 냅니다.
  • LineBorder: 컴포넌트 주위에 단순한 직사각형 선을 그립니다. 생성자에서 선의 색상과 두께를 지정할 수 있습니다.
  • MatteBorder: 특정 색상으로 테두리를 만들고 왼쪽·위쪽·오른쪽·아래쪽 각 면의 두께를 개별적으로 설정할 수 있습니다. 또한 테두리를 채우는 데 사용할 Icon을 전달할 수 있으며, 이미지(ImageIcon)나 Icon 인터페이스의 다른 구현체도 가능합니다.
  • TitledBorder: 기존 테두리에 제목을 붙인 형태입니다. TitledBorder 자체는 실제 테두리를 그리지 않고 다른 테두리 객체와 함께 제목만 표시하며, 복잡한 화면에서 관련 컨트롤들을 그룹화할 때 특히 유용합니다.
  • CompoundBorder: 서로 다른 두 테두리를 하나로 합성한 테두리입니다. 컴포넌트를 EmptyBorder로 감싸 여백을 확보한 뒤, 그 바깥에 EtchedBorder나 MatteBorder 같은 장식 테두리를 덧입히고 싶을 때 매우 편리합니다.

예제 코드

아래 예제는 BorderFactory의 다양한 팩토리 메서드를 활용해 여러 스타일의 테두리를 한 화면에 동시에 출력합니다.

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

public class BorderFactoryMain {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(run);
    }

    static Runnable run = new Runnable() {
        @Override
        public void run() {
            BorderFactoryTest test = new BorderFactoryTest();
            test.setVisible(true);
        }
    };

    public static class BorderFactoryTest extends JFrame {
        public BorderFactoryTest() {
            setTitle("BorderFactory Test");
            setSize(350, 400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new FlowLayout());

            add(createBorderedPanel(BorderFactory.createRaisedBevelBorder(),
                "createRaisedBevelBorder()"));
            add(createBorderedPanel(
                BorderFactory.createBevelBorder(BevelBorder.LOWERED),
                "createBevelBorder(BevelBorder.LOWERED)"));
            add(createBorderedPanel(
                BorderFactory.createBevelBorder(BevelBorder.RAISED),
                "createBevelBorder(BevelBorder.RAISED)"));
            add(createBorderedPanel(BorderFactory.createCompoundBorder(
                BorderFactory.createBevelBorder(BevelBorder.RAISED),
                BorderFactory.createBevelBorder(BevelBorder.LOWERED)),
                "createCompoundBorder(RAISED, LOWERED)"));
            add(createBorderedPanel(BorderFactory.createEtchedBorder(),
                "createEtchedBorder()"));
            add(createBorderedPanel(
                BorderFactory.createEtchedBorder(EtchedBorder.LOWERED),
                "createEtchedBorder(EtchedBorder.LOWERED)"));
            add(createBorderedPanel(
                BorderFactory.createEtchedBorder(EtchedBorder.RAISED),
                "createEtchedBorder(EtchedBorder.RAISED)"));
            add(createBorderedPanel(
                BorderFactory.createEtchedBorder(Color.lightGray, Color.yellow),
                "createEtchedBorder(Color.lightGray, Color.yellow)"));
            add(createBorderedPanel(BorderFactory.createLineBorder(Color.red),
                "createLineBorder(Color.red)"));
            add(createBorderedPanel(BorderFactory.createLineBorder(Color.blue, 5),
                "createLineBorder(Color.blue, 5)"));
            add(createBorderedPanel(BorderFactory.createDashedBorder(null),
                "createDashedBorder(null)"));

            setLocationRelativeTo(null);
        }
    }

    private static JPanel createBorderedPanel(Border b, String name) {
        JLabel label = new JLabel(name);
        JPanel panel = new JPanel();
        panel.setBorder(b);
        panel.add(label);
        return panel;
    }
}

실행 결과

프로그램을 실행하면 각 팩토리 메서드의 이름이 적힌 라벨이 해당 테두리 스타일로 감싸진 채 프레임에 배치되어, 테두리별 시각적 차이를 한눈에 비교할 수 있습니다.

Java BorderFactory로 다양한 테두리(Border) 구현하는 방법