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