저자: Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole, 역 한빛리포터 이상화
본 기사는『Java Swing, 2nd Edition』의 메뉴와 툴바에 대한 내용을 다룬 챕터를 요약한 마지막 기사이다. 이번 시간에는 툴바에 대해 살펴보기로 한다.
이전기사 보기
자바 스윙: 메뉴와 툴바 - 제 1편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 스윙 메뉴에 대한 설명을 하고 있다.
자바 스윙: 메뉴와 툴바 - 제 2편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 JmenuBar 클래스를 가지고 메뉴 바 선택 모델에 대한 설명을 하고 있다.
자바 스윙: 메뉴와 툴바 - 제 3편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 JMenuItem 클래스에 대한 설명을 하고 있다.
자바 스윙: 메뉴와 툴바 - 제 4편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 JpopupMenu 클래스에 대한 설명을 하고 있다.
자바 스윙: 메뉴와 툴바 - 제 5편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 Jmenu 클래스에 대한 설명을 하고 있다.
자바 스윙: 메뉴와 툴바 - 제 6편 『Java Swing, 2nd Edition』의 한 챕터를 요약한 기사로 좀더 복잡한 메뉴 아이템인 라디오 버튼 메뉴와 체크박스 메뉴를 설명하고 있다.
툴바는 응용프로그램에 접근하는 일반적인 방법 중 하나로 메뉴와 비교해볼 때, 실행 명령을 더 시각적으로 표현해줄 수 있다. 선택했을 경우에만 화면에 나타나는 메뉴와는 달리 툴바는 항상 화면에 나타나기 때문에 응용프로그램의 현재 상태를 나타내는 "dashboard" 역할을 한다. 반면 툴바는 메뉴 공간을 차지하기 때문에 사용자의 기호에 따라 화면에 보여 줄 수 있는 옵션을 제공하는 것이 좋다.
툴바는 이동 가능한 독립적인 창안에 속한 컴포넌트 혹은 프레임 내에서 "분리" 될 수 있다. 따라서 사용자는 화면내에서 어느 곳으로든지 자유롭게 툴바를 옮길 수 있는 확장성을 가지게 된다. 이 외에도 툴바는 레이아웃 관리자가 지원하는 특정 위치에 도킹할 수도 있다.
JToolBar 클래스
메뉴 바와 마찬가지로
JtoolBar 클래스는 다양한 컴포넌트를 위한 컨테이너이다. 버튼, 콤보 박스, 추가 메뉴까지 포함하여 어떤 컴포넌트라도 툴바에 추가할 수 있다. 메뉴처럼 툴바도
Action 객체와 쉽게 연동되기 때문에 작업하기 아주 쉽다.
툴바에 컴포넌트를 추가할 때 정수형 인덱스를 할당받게 되는데 이는 화면 왼쪽에서 오른쪽으로 정렬을 결정한다. 추가 될 수 있는 컴포넌트에 특별한 제한을 두지는 않지만 툴바와 같은 높이로 컴포넌트를 맞춰줄 경우 가장 보기 좋다. 툴바는 L&F에 의한 기본적인 경계를 가지고 있다. 만약 기본 설정을 변경하고 싶다면
setBorder( ) 메소드를 사용하여 경계 설정을 조정하면 된다. 다른 방법으로는
borderPainted 속성 값을
false로 설정해주어 경계 설정을 비활성화 할 수 있다.
JToolBar는 툴바 위에 빈 공간을 삽입할 수 있는 구분자가 있어
addSeparator( ) 메소드를 사용하여 구분자에 접근할 수 있다. 특히 구분자는 관련 툴바 컴포넌트들을 그룹화시켜 구분할 때 유용하다. 툴바의 구분자는 실제로 내부 클래스이다. 툴바의 구분자와
JSeparator 클래스를 혼동하지 않길 바란다.
[그림 14-20]은
JToolBar 컴포넌트의 클래스 다이어그램이다.
[그림 14-20] JToolBar 컴포넌트 클래스 다이어그램
떠다니는 툴바들
툴바가 스윙 컴포넌트 내에서 쉽게 자리 잡을 수 있지만 그렇다고 해서 반드시 한 곳에만 머무르게 할 필요는 없다. 대신, 툴바의 빈 공간(버튼이나 컴포넌트가 없는 공간)을 마우스로 잡고 드래깅하면 툴바를 떠다니게 할 수 있다. 이는 툴바를 하위 창으로 분리시켜 화면 어느 곳에서든지 보이게 해준다. 그러면 툴바는 프레임 내 특정 위치에 다시 붙거나 도킹 될 수 있다. 예제 속의 툴바를 이리저리 움직여 보자. [그림 14-21]은 떠다니는 툴바 예제이다.
[그림 14-21] 떠다니는 툴바
BorderLayout를 지원하는 컨테이너 내에 툴바를 두는 것이 가장 이상적이다. 떠다니는 툴바를 만들고 싶다면 컨테이너의 4면(동서남북) 중에 하나를 선택하여 툴바를 둔 후에 양쪽은 남겨두어라. 이렇게 해주면 툴바가 드래깅 될 때 나타나는 공간을 정의할 수 있다.
툴바를 고정시키려면
floatable 속성을
false 값으로 설정하면 된다.
JToolBar toolBar = new JToolBar( );
toolBar.setFloatable(false);
속성
클래스 속성은 [표 14-12]와 같다.
borderPainted 속성은 툴바 경계의 색칠 여부를 나타낸다.
JToolBar 생성자는 컴포넌트의 레이아웃 관리자를 x축을 따라
BoxLayout으로 초기화 한다(만약 방향이
VERTICAL이면 y축 기준).
margin 속성은 툴바 경계 끝과 컴포넌트 사이의 틈을 정의한다.
floatable 속성은 툴바가 컨테이너로부터 분리할 수 있는지 여부와 독립적인 윈도우로 떠다닐 수 있는지를 정의한다. 또한 툴바의 컴포넌트에 접근하기 위해서는 인덱스된
componentAtIndex 속성을 사용할 수 있다.
orientation 속성은 툴바가 수평인지 아니면 수직인지를 결정한다. 이 속성의 값은
SwingConstants에서 정의된 상수인
HORIZONTAL,
VERTICAL 중에 하나이어야 한다. 다른 값을 시도할 경우
IllegalArgumentException이 발생할 것이다. 마지막으로 SDK 1.4부터는
rollover 속성을 통해 마우스가 툴바 위로 떠다니면 툴바의 버튼 경계가 변하는데, 이런 종류의 인터페이스는 동적인 웹 사이트에서 흔히 사용된다. 하지만 모든 L&F가
rollover의
true 값을 보장하지는 않는다.
[표 14-12] JToolBar 속성들
속성 |
데이터 타입 |
get |
is |
set |
디폴트 값 |
accessibleContext |
AccessibleContext |
· |
|
|
JToolBar.AccessibleJToolBar( ) |
borderPaintedb |
boolean |
|
· |
· |
true |
componentAtIndexi |
Component |
· |
|
|
|
floatableb |
boolean |
|
· |
· |
true |
layouto |
LayoutManager |
· |
|
· |
BoxLayout(X_AXIS) |
marginb |
Insets |
· |
|
· |
Insets(0,0,0,0) |
orientationb |
int |
· |
|
· |
SwingConstants.HORIZONTAL |
rollover1.4, b |
boolean |
|
· |
· |
false |
UIb |
ToolBarUI |
· |
|
· |
From L&F |
UIClassIDo |
String |
· |
|
|
quot;ToolBarUI" |
1.4since 1.4, bbound, iindexed, ooverridden
Jcomponent 클래스를 보려면 [표 3-6] 참조. |
이벤트
관련 속성들이 변할 때 Jtoolbar는 PropertyChangeEvent를 발생시킨다.
생성자
public JToolBar( )
public JToolBar(int orientation)
public JToolBar(String name)
public JToolBar(String name, int orientation)
JToolBar를 생성하고, 추가적으로 툴바가 떠다닐 때 보이는 타이틀을 지원한다(이런 기능은 SDK 1.3부터 지원). 기본적으로 방향은 수평이며 변경하고 싶으면 SwingConstants.HORIZONTAL 또는 SwingConstants.VERTICAL를 사용하면 된다.
액션 추가
public JButton add(Action a)
툴바에 Action을 더한다. 이 메소드는 이미지 밑에 액션 문자열을 가진 단순한 JButton을 생성한다. 이것은 JButton을 반환할 뿐만 아니라 모든 버튼의 속성을 초기화 할 수 있다. (생각했던대로 툴바에 컴포넌트를 추가하는 메소드는 Container를 상속 받는다.)
기타
public void updateUI( )
현재의 UI 매니저와 컴포넌트를 위한 대리자(delegate)를 초기화 하고 L&F을 업데이트한다.
public int getComponentIndex(Component c)
해당 컴포넌트 c의 정수형 인덱스를 반환하거나 찾지 못했다면 -1을 반환한다. 툴바 내의 구분자도 인덱스를 가지고 있음에 주의하자.
public void addSeparator( )
public void addSeparator(Dimension size)
툴바에 구분자를 등록한다. 스윙 컴포넌트를 구분하는 Jseparator와 혼동하지 말기 바란다. 이 메소드에의해 생성된 툴바 구분자는 툴바 컴포넌트 그룹을 구분하는 단순한 빈 공간이다. 구분자의 크기를 명시적으로 변경하더라도 그 크기는 보통 툴바의 폭 정도가 된다.
툴바 생성하기
아래 예제에서는 앞서 살펴 본 JMenu 예제에 툴바를 추가한 것이다. 그리고 사용자 인터페이스 구축에 유용하게 사용되는 Action 객체들을 사용하였다.
몇몇 유용한 기능을 추가시켜 사용자가 콤보 박스에서 폰트를 선택할 수 있게 하였다. 이는 툴바 내에서 다양한 컴포넌트를 사용할 수 있다는 것을 보여주고 있다. 콤보 박스와 JLabel를 추가하고 콤보 박스는 자신의 actionPerformed ( ) 메소드를 사용한다.
// ToolBarExample.java
//
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
public class ToolBarExample extends JPanel {
public JTextPane pane;
public JMenuBar menuBar;
public JToolBar toolBar;
String fonts[ ] = {"Serif","SansSerif","Monospaced","Dialog","DialogInput"};
public ToolBarExample( ) {
menuBar = new JMenuBar( );
// 메뉴와 툴바 양단에 사용되는 ACTION을 생성한다.
DemoAction leftJustifyAction = new DemoAction("Left",
new ImageIcon("left.gif"), "Left justify text", "L");
DemoAction rightJustifyAction = new DemoAction("Right",
new ImageIcon("right.gif"), "Right justify text", "R");
DemoAction centerJustifyAction = new DemoAction("Center",
new ImageIcon("center.gif"), "Center justify text", "M");
DemoAction fullJustifyAction = new DemoAction("Full",
new ImageIcon("full.gif"), "Full justify text", "F");
JMenu formatMenu = new JMenu("Justify");
formatMenu.add(leftJustifyAction);
formatMenu.add(rightJustifyAction);
formatMenu.add(centerJustifyAction);
formatMenu.add(fullJustifyAction);
menuBar.add(formatMenu);
toolBar = new JToolBar("Formatting");
toolBar.add(leftJustifyAction);
toolBar.add(rightJustifyAction);
toolBar.add(centerJustifyAction);
toolBar.add(fullJustifyAction);
toolBar.addSeparator( );
JLabel label = new JLabel("Font");
toolBar.add(label);
toolBar.addSeparator( );
JComboBox combo = new JComboBox(fonts);
combo.addActionListener(new ActionListener( ) {
public void actionPerformed(ActionEvent e) {
try { pane.getStyledDocument( ).insertString(0,
"Font [" + ((JComboBox)e.getSource( )).getSelectedItem( ) +
"] chosen!\n", null);
} catch (Exception ex) { ex.printStackTrace( ); }
}
});
toolBar.add(combo);
// Action중에 하나를 비활성화 시킨다.
fullJustifyAction.setEnabled(false);
}
public static void main(String s[ ]) {
ToolBarExample example = new ToolBarExample( );
example.pane = new JTextPane( );
example.pane.setPreferredSize(new Dimension(250, 250));
example.pane.setBorder(new BevelBorder(BevelBorder.LOWERED));
example.toolBar.setMaximumSize(example.toolBar.getSize( ));
JFrame frame = new JFrame("Menu Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(example.menuBar);
frame.getContentPane( ).add(example.toolBar, BorderLayout.NORTH);
frame.getContentPane( ).add(example.pane, BorderLayout.CENTER);
frame.pack( );
frame.setVisible(true);
}
class DemoAction extends AbstractAction {
public DemoAction(String text, Icon icon, String description,
char accelerator) {
super(text, icon);
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(accelerator,
Toolkit.getDefaultToolkit( ).getMenuShortcutKeyMask( )));
putValue(SHORT_DESCRIPTION, description);
}
public void actionPerformed(ActionEvent e) {
try { pane.getStyledDocument( ).insertString(0,
"Action [" + getValue(NAME) + "] performed!\n", null);
} catch (Exception ex) { ex.printStackTrace( ); }
}
}
}
상단의 예제에서는 문자열의 자리 맞춤을 나타내기 위해 Action 단일 집합을 생성하였다. 이것을 통해 한 줄의 코드로 메뉴와 툴바를 생성할 수 있다. 각각은 적당한 라벨 또는 아이콘 또는 단축키를 가지고 있다. 마우스를 버튼 위로 움직이면 툴팁을 볼 수 있다. Full Action을 비활성화시키면 자동으로 이에 상응하는 메뉴 아이템과 툴바 버튼이 비활성화 된다. Action이 비활성화되면 연결된 모든 컴포넌트들이 적절한 속성 변화를 감지하게 되고 [그림 14-22]와 같이 메뉴 아이템, 툴바 버튼이 회색으로 변한다.
[그림 14-22] Action을 비활성화시키면 툴바와 메뉴 아이템이 회색으로 변함
떠다니는 툴바를 확인하고 싶다면 툴바의 특정 영역(툴바를 이동시킬 수 있도록 선택하는 부분)을 클릭하고 창 바깥쪽으로 드래그 하면 된다. 프레임 어디에서든지 툴바를 고정시키고 이동시킬 수 있다.
JtoolBar는 일반적인 스윙 컴포넌트이기 때문에 응용프로그램에서 하나 이상의 툴바를 사용할 수도 있다. 툴바를 여러 개 만들고 싶거나 떠다니게 만들고 싶다면 각각의 툴바들을 집중적인 BorderLayout 컨테이너 속에 포함시키는 것이 가장 좋은 방법이며 나머지 3개의 영역은 남겨놓는 것이 좋다. 툴바들이 새로운 영역으로 이동하면 각각의 위치를 유지하게 된다.
TAG :