국제화를 할 때 흔히 빠뜨리기 쉬운 것 중의 하나가 컴포넌트의 방향성(component orientation)이다. 영어와 서유럽의 언어는 글자를 왼쪽에서 오른쪽, 위에서 아래로 쓰지만 모든 언어가 그런 것은 아니다. 예를 들면 히브리어와 아라비아 말과 같은 많은 중동의 언어들은 오른쪽에서 왼쪽, 위에서 아래로 쓰여진다. 몽골에서는 먼저 위에서 아래로, 그리고는 오른쪽에서 왼쪽으로 글자를 쓴다. 일본어, 중국어, 한국어와 같은 동방의 언어는 서유럽의 언어처럼 쓰기도 하고, 위에서 아래로, 오른쪽에서 왼쪽으로 쓰기도 한다.
차이점을 확실하게 이해하기 위해 다음 예제들을 보자.
CASE 1. 왼쪽에서 오른쪽, 위에서 아래
A B C D E F G H I
CASE 2. 오른쪽에서 왼쪽, 위에서 아래
C B A F E D I H G
CASE 3. 위에서 아래, 왼쪽에서 오른쪽
A D G B E H C F I
CASE 4. 위에서 아래, 오른쪽에서 왼쪽
G D A H E B I F C
이것이 스윙과 그래픽 인터페이스에 미치는 영향은 무엇일까? 국제시장을 목표로 삼는다면, 개발자는 ComponentOrientation 속성(property)을 고려해서 프로그램을 디자인해야 한다.
java.awt 패키지의 ComponentOrientation class는 Locale에서 쓰이는 컴포넌트의 방향을 찾아내서 그에 따라 스크린에 내용이 배치될 수 있도록 디자인 하게끔 해준다. 사용자는 getOrientation(Locale) 메소드를 사용해서 Locale의 ComponentOrientation을 알아낼 수가 있다. 그리고 나서 isHorizontal 메소드를 사용해서 방향이 수평인지 아닌지를, (여기서 수평이라 함은 CASE 1과 CASE 2 모두를 말한다.) 또한 isLeftToRight메소드를 사용해서 방향이 왼쪽에서 오른쪽인지를 알아낼 수도 있다. (왼쪽에서 오른쪽이 의미하는 것은 CASE 1과 CASE 3를 말한다.)
왜 방향을 알아내야 할까? 한가지 이유는 스크린을 구축하기 위해서다. BorderLayout클래스는 일반적으로 스크린을 생성하기 위해 사용되는데 NORTH, SOUTH, EAST, 와 WEST을 이용해서 컴포넌트들을 위, 아래, 왼쪽, 오른쪽에 위치시킬 수가 있다. CENTER를 이용해서 컴포넌트를 가운데에 위치시킬 수도 있다. 하지만 이를 모르는 많은 사람들은 PAGE_START, PAGE_END, LINE_START, LINE_END와 같은 복잡한 세트를 사용하려고 애를 쓰곤 한다. (J2SE 1.2에서 BEFORE_FIRST_LINE (PAGE_START), AFTER_LAST_LINE (PAGE_END), BEFORE_LINE_BEGINS (LINE_START), and AFTER_LINE_ENDS (LINE_END).)처럼 복잡했던 것이 J2SE 1.4에서 간단해 진 것이다.)사실 EAST 와 WEST는 로만 랭귀지(Roman Language)에서는 문제없이 쓸 수 있지만, 다른 언어에서는 그렇지가 않다. 가령, 라인의 시작점에 컴포넌트를 위치시키고자 한다면, 오른쪽에서 왼쪽으로 쓰는 언어에서는 WEST사이드에, 왼쪽에서 오른쪽으로 쓰는 언어에서는 EAST사이드에 컴포넌트가 위치되어야 한다. 때문에 이것 대신, LINE_START을 사용하면 훨씬 명확해질 뿐만 아니라 지구상의 어떤 곳에서도 정확히 동작하게 할 수 있다.
BorderOrientation 를 실행해서 확실히 이해해 보자. 하나는 US-English에, 다른 하나는 Israel-Hebrew 로컬에 최적화된 2개의 스크린을 띄우게 된다.
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class BorderOrientation {
public static void main(String args[]) {
JFrame frame1 = new JFrame("US");
frame1.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
ComponentOrientation usOrientation =
ComponentOrientation.getOrientation(
Locale.US);
Container contentPane1 =
frame1.getContentPane();
contentPane1.setComponentOrientation(
usOrientation);
contentPane1.add(new JButton(
"LineEnd"), BorderLayout.LINE_END);
contentPane1.add(new JButton(
"LineStart"), BorderLayout.LINE_START);
contentPane1.add(new JButton(
"PageStart"), BorderLayout.PAGE_START);
contentPane1.add(new JButton(
"PageEnd"), BorderLayout.PAGE_END);
frame1.pack();
frame1.setLocation(100, 100);
frame1.show();
JFrame frame2 = new JFrame("Israel");
frame2.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Locale israel = new Locale("he", "IL");
ComponentOrientation hebrewOrientation =
ComponentOrientation.getOrientation(israel);
Container contentPane2 =
frame2.getContentPane();
contentPane2.setComponentOrientation(
hebrewOrientation);
contentPane2.add(new JButton(
"LineEnd"), BorderLayout.LINE_END);
contentPane2.add(new JButton(
"LineStart"), BorderLayout.LINE_START);
contentPane2.add(new JButton(
"PageStart"), BorderLayout.PAGE_START);
contentPane2.add(new JButton(
"PageEnd"), BorderLayout.PAGE_END);
frame2.pack();
frame2.setLocation(200, 200);
frame2.show();
}
}
여기서는 편의를 위해 버튼 레이블을 하드 코딩된 스트링으로 만들었지만 실제로는 버튼 레이블이 리소스 번들로부터 양생되어야 한다는 점을 명심하자.
사실 지역과 컴포넌트의 방향에 따라서 스크린을 항상 다르게 구축해야 할 필요는 없다. 예를 들면, FlowLayout를 이용하는 컨테이너는 방향이 오른쪽에서 왼쪽일 때, 컴포넌트를 반대 방향으로 둘 수가 있다. 또한 텍스트 컴포넌트와 같은 몇몇의 컴포넌트들은 세팅 방향에 기초해서 컨텐츠를 레이 아웃할 것이다. Jtree와 같은 컴포넌트들은 방향이 오른쪽에서 왼쪽일 때, 트리의 방향을 반대쪽으로 바꾼다. TreeSample프로그램을 실행시켜서 보면, 컴포넌트의 방향이 오른쪽에서 왼쪽일 경우, JTree가 "뒤집힌" 트리를 디스플레이하고 있는 것을 알 수 있다.
import java.awt.*;
import javax.swing.*;
public class TreeSample {
public static void main (String args[]) {
JFrame f = new JFrame("Flipped");
f.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Container content = f.getContentPane();
JTree tree = new JTree();
tree.setComponentOrientation(
ComponentOrientation.RIGHT_TO_LEFT);
JScrollPane scrollPane = new JScrollPane(tree);
content.add(scrollPane, BorderLayout.CENTER);
f.setSize (300, 200);
f.show();
}
}
다른 AWT와 Swing 컴포넌트 또한 현재 세팅된 컴포넌트의 방향에 따라 컨텐츠의 방향을 바꿀 수가 있다. JTable에서는 방향이 오른쪽에서 왼쪽일 경우에 열(colume)의 순서가 뒤집어지고, JMenuBar에서는 메뉴가 뒤집어진다. 가령, 일반적으로 왼쪽 멀리 위치하는 File 메뉴는 뒤집혔을 때 반대 방향으로 옮겨진다. 개발자로서 이 컴포넌트들을 처리하기 위해 무언가를 할 필요는 없다. 단지 모든 것이 익숙한 방법으로 나타나지 않을 수도 있다고 마음 먹고 있으면 된다. 하지만 예외적으로 JOptionPane는 요소들의 위치를 모두 정의한다.
스윙의 ComponentOrientation 에 대한 정보는 "Component Orientation in Swing: How JFC Components Support 'BIDI' Text"를 참고한다.
"Java SE" 카테고리의 다른 글
- JSSE 이용한 안전한 커뮤니케이션 (댓글 2개 / 트랙백 0개) 2004/08/31
- 3D 화면(scene)에 빛 효과 주기 (댓글 1개 / 트랙백 0개) 2004/07/30
- Java SE & Java SE for Business 지원 로드맵 (댓글 0개 / 트랙백 0개) 2009/09/11
- 클래스에서 enhanced For-Loop 사용 (댓글 0개 / 트랙백 1개) 2007/10/09
- VARIABLE CONTENT로 메세지 포맷하기 (댓글 7개 / 트랙백 2개) 2003/08/19
- CONTENTPANE 작업의 변화 (댓글 1개 / 트랙백 0개) 2004/11/11
- 새로운 포매터로 출력물 포맷하기 (댓글 1개 / 트랙백 0개) 2004/10/27
- 스윙 유저 인터페이스에서 컴포넌트의 방향성 (댓글 2개 / 트랙백 0개) 2003/09/26
- 쓰레드의 상태정보를 저장할 때 사용되는 THREADLOCAL 변수들 (댓글 4개 / 트랙백 0개) 2003/12/12
- 2개의 스트링이 같은 경우는? (댓글 2개 / 트랙백 0개) 2004/05/27
댓글을 달아 주세요
국제화에 맞게 나라마다 관습에 맞게 설정을 해야 되겠네요.
2007/09/19 02:24좋은 정보 감사해요~
2007/09/19 05:56