반응형

JTabbedPane 컴포넌트는 특별한 Swing 컨테이너로, 컴포넌트를 각 탭에 대한 패널 내에 배치할 수 있도록 해줍니다. 탭의 컴포넌트를 보려면 해당 탭을 선택하십시오. 기술적으로 표현하자면, 하나의 컴포넌트는 각각의 탭과 연관됩니다. 그리고 그 컴포넌트는 다른 컴포넌트들을 포함하는 패널인 경우가 일반적입니다. 탭마다 설정할 수 있는 제목 글자와 아이콘으로 각각의 탭을 식별합니다. JTabbedPane 컴포넌트에 대한 첫 번째 Core Java Technologies Tech Tip은 2001년 7월에 간단한 소개 팁과 함께 발행되었습니다.

탭 위에 컴포넌트를 사용할 수 있도록 지원하는 JTabbedPane의 방법은 다음과 같습니다.

  • public void setTabComponentAt(int index, Component component)
  • public Component getTabComponentAt(int index)
  • public int indexOfTabComponent(Component tabComponent)

첫 번째 메소드는 컴포넌트를 탭과 연관시킵니다. 두 번째 메소드는 컴포넌트를 돌려주며 마지막 메소드는 컴포넌트와 연관되어 있는 탭이 있으면 그것을 알려줍니다. 대개 사용자들은 첫 번째 방법만 사용하지만 나머지 것들도 이용할 수 있습니다.

늘 사용할 수 있는 태스크로 시작해 봅시다. 아이콘을 구현해 보면 도움이 될 것입니다. 이것은 아이콘 위에 작은 x를 그리는 것입니다. 문자 x를 버튼 레이블로 사용할 수도 있겠지만 여기서는 그 방법을 사용하지 마십시오. 일반적으로 박스 안에 있는 x는 윈도우를 닫는 명령을 의미하므로 여기에서는 탭 닫기 기능에 대한 유용한 표지 역할을 하게 됩니다.

class CloseIcon implements Icon {
  public void paintIcon(Component c, Graphics g, int x, int y) {
    g.setColor(Color.RED);
    g.drawLine(6, 6, getIconWidth() - 7, getIconHeight() - 7);
    g.drawLine(getIconWidth() - 7, 6, 6, getIconHeight() - 7);
  }
  public int getIconWidth() {
    return 17;
  }
  public int getIconHeight() {
    return 17;
  }
}

탭 컴포넌트를 생성하기 전에 프로그램의 프레임워크부터 구성합시다. 이 프레임워크는 위에 JTabbedPane이 있는 프레임을 생성하고 여러 개의 탭을 추가합니다.

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

public class CloseTabs {
  public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        JFrame frame = new JFrame("JTabbedPane");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane jtp = new JTabbedPane();
        frame.add(jtp, BorderLayout.CENTER);
        for (int i=0; i<5; i++) {
          JButton button = new JButton("Card " + i);
          jtp.add("Btn " + i, button);
          // new CloseTabButton(jtp, i);
        }
        frame.setSize(400, 200);
        frame.setVisible(true);
      }
    };
    EventQueue.invokeLater(runner);
  }
}

이 프로그램은 5개의 탭을 생성하며 각 탭에는 JButton이 하나씩 있습니다. 탭 타이틀은 "Btn"에 탭 위치를 이어 붙인 것입니다.

프로그램은 달리 무엇을 하지 않아도 잘 수행될 것입니다. 그러나 탭에 닫기 버튼이 없습니다. 탭에 닫기 버튼을 추가하려면 해당 탭의 제목 글자와 아이콘은 유지하면서 앞에서 본 CloseIcon을 버튼에 추가합니다. (예에서는 탭 아이콘을 사용하지 않았으나 클래스 정의에는 하나를 포함하여 이 예제 밖에서 재사용할 수 있도록 했습니다.) 정의의 마지막 파트로, 버튼을 눌렀을 때의 처리를 위해 버튼에 대한 ActionListener가 필요합니다. 사용자가 버튼을 누르면 탭이 pane에서 제거되도록 합니다.

class CloseTabButton extends JPanel implements ActionListener {
  private JTabbedPane pane;
  public CloseTabButton(JTabbedPane pane, int index) {
    this.pane = pane;
    setOpaque(false);
    add(new JLabel(
        pane.getTitleAt(index),
        pane.getIconAt(index),
        JLabel.LEFT));
    Icon closeIcon = new CloseIcon();
    JButton btClose = new JButton(closeIcon);
    btClose.setPreferredSize(new Dimension(
        closeIcon.getIconWidth(), closeIcon.getIconHeight()));
    add(btClose);
    btClose.addActionListener(this);
    pane.setTabComponentAt(index, this);
  }
  public void actionPerformed(ActionEvent e) {
    int i = pane.indexOfTabComponent(this);
    if (i != -1) {
      pane.remove(i);
    }
  }
}

이제 사용자가 직접 만든 tabbed pane에서 CloseTabButton을 재사용할 수 있습니다.

tabbed pane의 사용에 대한 자세한 정보는 자바 튜토리얼 How to Use Tabbed Panes를 참조하십시오.

저자 JZ Ventures사의 사장 겸 대표 컨설턴트인 John Zukowski

이 글의 영문 원본은
http://blogs.sun.com/CoreJavaTechTips/entry/placing_components_on_tabs2
에서 보실 수 있습니다.

+ Recent posts