반응형

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
에서 보실 수 있습니다.
반응형
예전에 Editplus 로 날코딩 할때, 일본어 文字化け문제로 고생하던 때가 생각난다.

지금 일본에서 프로그램을 짜고 있는중에, 역시 같은 문제에 봉착했다.

다국어를 지원해야 하는 프로젝트일 경우 모든 소스(JSP, Java, properties파일, log파일등)를 UTF-8로 작성하고 저장해야 한다.

그렇지 않으면 소스에 일본어나 한글 주석을 넣을 경우 깨져버리고 만다. Java 가상머신은 컴파일시 MS949포맷을 사용하는 것 같다.

따라서 UTF-8로 저장할 경우 화면에는 깨끗하게 잘나오지만(한글도 일본어도 잘 나온다) 빌드시 엄청난 Warning 메세지를 보게

될 것이다   아직 이 문제를 해결하지 못했다.

서두는 이만하고 Eclipse에서 UTF-8로 저장하는 법을 알아보자.

 Window - Preferences 메뉴에 들어간 후, General Tab에서&nbsp;Content types을 클릭하자. 그러면 다음 화면을&nbsp; 보게 될것이다.

여기서 해당 Tab을 클릭하고 맨 아래에 있는 Default encoding을 UTF-8로 설정하고 update 버튼을 눌러준다.

화면은 Java Source File을 변경하고 있는 장면이다. 여기서 주의할 점은 기존에 한글이나, 일본어가 소스안에

코딩되어있다면, update시 다 깨져버린다는 것이다. 혹시 UTF-8로 저장하지 않았을 경우는 변경전에 백업하기

바란다.

&nbsp;마지막으로 다들 알고 있을 것이라 생각하지만, 다국어를 깨지지 않고 제대로 보여주는 것은 Jsp나&nbsp;&nbsp;Mime-type의

encoding을 설정하는 것과는 별개의 문제라는 것이다. UTF-8로 저장하지 않으면 JSP에서

<%@ page language="java" contentType="text/html; charset=UTF-8"%>

로 설정해도 깨져서 보인다는 것이다.

Encoding과 관련에서 다음번에는 &nbsp;File Upload , Download를 구현할 때의 encoding 문제에 대해서 글을 올려볼까 생각중이다.

워낙 내용이 복잡한데다, 나 자신도 아직 정리가 안 된 상태라 생각나는데로 올리고자 한다.


&lt;삽질하지 않는 그 날을 향해 난 오늘도 삽질한다.


사용자 삽입 이미지
 
반응형

자바를 공부하면서 윈도우 종료 스케쥴러를 한번 만들어 봤습니다.

단순하게 작성된 것이라 공개하기에는 부족한 점이 많지만

사용상 편리하리라 생각되어 올리게 되었습니다.

설치버전과 압축버전으로 나누어져 있습니다.

설치버전은 jsmooth 와 install factory 2.7 버전을 이용하여 만들었습니다.

영화나 파일 다운시 윈도우 종료 스케쥴러로 사용하려고 만들었습니다.

사용자 삽입 이미지
위에 모습이 실행시 UI화면 이구요 trayicon을 사용하려고 윈도우 닫기 버튼을 누르면

화면에서 모습은 사라지게 됩니다. tray에 상주하게 되구요.

프로그램 종료는 트레이에서 마우스 오른쪽 버튼을 누르고 exit을 클릭하시면 됩니다.

분단위로 시간 설정하시고 setting 버튼 클릭.

예약 설정을 취소하시고 싶으시면 cancel 버튼 클릭하시면 됩니다.

참고로 java 프로그램을 사용하시려면 JRE가 설치 되어 있어야 합니다.

JRE 설치는 www.java.com

+ Recent posts