반응형

javax.swing.border.AbstractBorder는 Swing UI 컴포넌트에서 사용되는 추상 클래스로, 컴포넌트 주위의 경계선(Border)을 구현하기 위한 기본 클래스입니다. AbstractBorder를 상속받아 새로운 Border 클래스를 만들면, 컴포넌트 주위에 원하는 형태의 경계선을 그릴 수 있습니다.

AbstractBorder 클래스는 다음과 같은 메서드를 제공합니다.

- `getBorderInsets(Component c)`: 컴포넌트 주위의 경계선을 그릴 때 필요한 여백을 반환합니다.
- `isBorderOpaque()`: 경계선이 완전히 불투명한지 여부를 반환합니다.
- `paintBorder(Component c, Graphics g, int x, int y, int width, int height)`: 컴포넌트 주위의 경계선을 그립니다.

이 클래스는 추상 클래스이므로, 이를 직접 사용하는 대신 이를 상속받아 새로운 Border 클래스를 만들어야 합니다. 예를 들어, 다음과 같이 TitledBorder 클래스를 만들어 사용할 수 있습니다.

 

import javax.swing.border.AbstractBorder;
import javax.swing.border.TitledBorder;

public class MyTitledBorder extends AbstractBorder {
  private String title;

  public MyTitledBorder(String title) {
    this.title = title;
  }

  public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    // 경계선 그리기
    g.setColor(Color.BLACK);
    g.drawRect(x, y, width, height);

    // 제목 그리기
    g.drawString(title, x + 5, y - 5);
  }

  public Insets getBorderInsets(Component c) {
    return new Insets(10, 10, 10, 10);
  }

  public boolean isBorderOpaque() {
    return true;
  }
}


위 예제에서 MyTitledBorder 클래스는 AbstractBorder 클래스를 상속받아 구현한 사용자 정의 Border 클래스입니다. paintBorder() 메서드에서는 검은색 사각형 경계선과 제목을 그리고, getBorderInsets() 메서드에서는 경계선 그리기에 필요한 여백을 반환하고, isBorderOpaque() 메서드에서는 경계선이 완전히 불투명하다는 것을 반환합니다.

위와 같이 AbstractBorder 클래스를 상속받아 새로운 Border 클래스를 만들면, 컴포넌트의 경계선을 커스터마이징할 수 있습니다. 이를 활용하면, 보다 다양하고 풍부한 UI를 만들 수 있습니다.그러나 AbstractBorder 클래스는 그 자체로는 경계선을 그리지 않습니다. 대신 이를 상속받아 실제로 경계선을 그리는 클래스를 만들어야 합니다. 이를 통해 개발자는 자신의 애플리케이션에 맞게 커스텀 경계선을 만들 수 있습니다.

AbstractBorder 클래스는 자주 사용되는 기본적인 경계선을 그리기 위한 하위 클래스도 제공합니다. 예를 들어 LineBorder, BevelBorder, SoftBevelBorder 등의 클래스가 있으며, 이들 클래스는 AbstractBorder를 상속받아 구현되어 있습니다.

다음은 AbstractBorder를 상속받아 간단한 경계선을 구현한 예제 코드입니다.

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

public class MyBorder extends AbstractBorder {

  private Color color;
  private int thickness;

  public MyBorder(Color color, int thickness) {
    this.color = color;
    this.thickness = thickness;
  }

  public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    g.setColor(color);
    for (int i = 0; i < thickness; i++) {
      g.drawRect(x + i, y + i, width - i * 2 - 1, height - i * 2 - 1);
    }
  }

  public Insets getBorderInsets(Component c) {
    return new Insets(thickness, thickness, thickness, thickness);
  }

  public boolean isBorderOpaque() {
    return true;
  }
}

위 예제 코드에서는 AbstractBorder 클래스를 상속받아 MyBorder 클래스를 구현합니다. 이 클래스는 생성자에서 색상과 두께를 전달받아 그려지는 경계선을 구현합니다. paintBorder() 메서드에서는 전달받은 색상과 두께를 사용하여 사각형을 그리고, getBorderInsets() 메서드에서는 사각형 그리기에 필요한 여백을 반환합니다.

AbstractBorder 클래스는 Swing UI 컴포넌트에서 매우 유용한 클래스 중 하나이며, 이를 활용하여 사용자 정의 경계선을 만들 수 있습니다.다음은 AbstractBorder를 상속받아 구현한 예제 코드입니다. 이 예제 코드는 라벨 컴포넌트에 적용할 경계선을 구현한 클래스입니다.

 

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

public class MyBorder extends AbstractBorder {

  private Color color;
  private int thickness;

  public MyBorder(Color color, int thickness) {
    this.color = color;
    this.thickness = thickness;
  }

  public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    g.setColor(color);
    for (int i = 0; i < thickness; i++) {
      g.drawRect(x + i, y + i, width - i * 2 - 1, height - i * 2 - 1);
    }
  }

  public Insets getBorderInsets(Component c) {
    return new Insets(thickness, thickness, thickness, thickness);
  }

  public boolean isBorderOpaque() {
    return true;
  }
}


위 예제 코드에서는 AbstractBorder 클래스를 상속받아 MyBorder 클래스를 구현합니다. 이 클래스는 생성자에서 색상과 두께를 전달받아 그려지는 경계선을 구현합니다. paintBorder() 메서드에서는 전달받은 색상과 두께를 사용하여 사각형을 그리고, getBorderInsets() 메서드에서는 사각형 그리기에 필요한 여백을 반환합니다.

위 예제 코드를 사용하여 다음과 같이 라벨 컴포넌트에 경계선을 적용할 수 있습니다.

 

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

public class MyLabel extends JFrame {

  public MyLabel() {
    JLabel label = new JLabel("Hello, World!");
    label.setBorder(new MyBorder(Color.RED, 5));
    add(label, BorderLayout.CENTER);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 300);
    setVisible(true);
  }

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

 

위 예제 코드에서는 JFrame 클래스를 상속받은 MyLabel 클래스를 정의하고, 생성자에서 라벨 컴포넌트를 생성하여 MyBorder 클래스로 지정된 경계선을 적용합니다.

반응형

+ Recent posts