탭에 컴포넌트 배치하기 java swing
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를 참조하십시오.
이 글의 영문 원본은
http://blogs.sun.com/CoreJavaTechTips/entry/placing_components_on_tabs2
에서 보실 수 있습니다.