2013년 12월 25일 수요일

SWT - Composite, Group, SashForm, TabFolder




컴포지트(Composite)를 이용한 컴포넌트(Component)의 포함 이해하기




Composite 클래스


  일반적으로 Composite 객체는 GUI 나 애플리케이션 코드에서 위젯을 구성할 때 사용합니다. Control 처럼 Composite는 크기를 재조정하거나 위치를 재조정 할 수 있습니다. 아래의 메서드들은 애플리케이션이 Composite에 포함한 위젯을 관리할 수 있도록 합니다.

Composite 클래스의 메서드



  getTabList() 와 setTabList() 는 Composite에서 위젯의 탭 순서를 얻거나 설정합니다. 탭 순서란 사용자가 탭 키를 반복적으로 누를 때 선택되는 위젯의 순서입니다.



Control, Scrollable, Composite 클래스의 계층적 구조



  위의 계층구조를 보면, Composite 클래스는 Scrollable 클래스의 하위 클래스입니다. 이는 모든 SWT/JFace에서의 Composite 객체가 스크롤바를 가진다는 것을 의미합니다. 아래의 메서드는 Scrollable 객체가 사용할 수 있습니다.


Scrollable 클래스의 메서드



  getSize() 메서드는 Control의 주요 면적 크기를 알려주지만, 타이틀바, 스크롤바, 상태바가 얼만큼의 영역을 차지할지는 알려주지 않습니다. Composite에서 편집 불가능한 해당 영역을 트림(Trim)이라고 부릅니다. 반면 편집 가능한 영역은 클라이언트 영역이라고 하며, Composite의 getClientArea() 메서드를 사용하여 알 수 있습니다. 





Group 클래스


  Group은 스스로 동작하지 않으며, 단지 애플리케이션의 외관과 구조를 향상시켜 줍니다. 기본적으로 Group은 자식 위젯을 둘러싸는 사각형의 경계선을 그리고 레이블을 붙입이다. 이 레이블은 setText()로 설정할 수 있습니다.

  Group에 제공하는 스타일은 구분자(Separator)와 유사하며, SWT.SHADOW_IN, SWT.SHADOW_OUT, SWT.SHADOW_NONE 를 제공합니다. 추가적으로, 식각(etching)과 같은 그림자 효과를 표현할 SWT.SHADOW_ETCHED_IN, SWT.SHADOW_ETCHED_OUT 스타일을 선택할 수 있습니다.

  Group 클래스는 확장할 수 없으므로, Composite 클래스를 확장하고, Group 객체를 그 안에 둡니다.



<예제 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.swtjface.ch3;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
/**
 * 2010.05.22
 * Composite를 확장한 Group 객체 생성
 * @author cremazer
 *
 */
public class Ch3_Group extends Composite {
 public Ch3_Group(Composite parent) {
  super(parent, SWT.NONE);
  
  Group group = new Group(this,SWT.SHADOW_ETCHED_IN);
  group.setText("Group Label");
  
  Label label = new Label(group, SWT.NONE);
  label.setText("Two Button :");
  label.setLocation(20, 20);
  label.pack();
  
  Button bt1 = new Button(group, SWT.PUSH);
  bt1.setText("Push Button");
  bt1.setLocation(20, 45);
  bt1.pack();
  
  Button bt2 = new Button(group, SWT.CHECK);
  bt2.setText("Check Button");
  bt2.setBounds(20, 75, 90, 30);
  
  group.pack(); 
 }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.swtjface.ch3;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
/**
 * 2010.05.22
 * Composite의 하위 클래스를 보여줄 Viewer
 * 참조 : SWT/JFace in Action
 * @author cremazer
 *
 */
public class CompositeViewer extends ApplicationWindow {
    
 public CompositeViewer() {  
  super(null);
 }
 
 protected Control createContents(Composite parent){
  getShell().setText("Group Example");
  parent.setSize(400, 250);
  
  //그룹 객체를 Composite 안에 생성한다.
  Ch3_Group group = new Ch3_Group(parent);
  
  return parent;
 }
 
 public static void main(String[] args) {
  CompositeViewer compViewer = new CompositeViewer();
  compViewer.setBlockOnOpen(true);
  compViewer.open();
  Display.getCurrent().dispose(); 
 }
}


<결과>









SashForm 클래스


  Group 컨테이너가 정적인 표현에 적절하다 해도, 애플리케이션은 때때로 컨트롤의 크기를 동적으로 조정할 필요가 있습니다. SashForm은 사용자가 Composite 자식들의 크기를 조작할 수 있도록 합니다. Sash라고 부르는 이 경계선 덕분에 사용자는 Composite에서 하나의 위젯 크기를 늘리는 동시에 다른 위젯 크기를 줄일 수 있습니다.

  SashForm과 연관된 스타일과 메서드는 주로 Sash의 위치와 자식 위젯 크기의 확장 및 감소 비율을 다룹니다. 




  •   setOrientation() : SWT.HORIZONTAL과 SWT.VERTICAL 상수 중 하나를 메서드로 설정하여 Sash의 방향을 명시할 수 있습니다. 
  •   getMaximizedControl() : 현재 최대 크기로 확장되어 있는 Control 객체를 반환합니다. 
  •   getWidgets() : SashFrom의 자식들 각각의 가중치를 정수 배열로 반환합니다. 
  •   setWidgets() : Composite에 있는 정수 배열을 이용하여 각 위젯의 가중치를 설정합니다.




<에제 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.swtjface.ch3;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
 
/**
 * 2010.05.22
 * Composite를 확장한 SashForm 객체 생성
 * @author cremazer
 *
 */
public class Ch3_SashForm extends Composite {
    
 public Ch3_SashForm(Composite parent) {
  super(parent, SWT.NONE);
  
  SashForm sf = new SashForm(this,SWT.VERTICAL);
  sf.setSize(120, 80);
  Button bt1 = new Button(sf, SWT.ARROW | SWT.UP);
  bt1.setSize(120, 40);
  
  Button bt2 = new Button(sf, SWT.ARROW | SWT.DOWN);
  bt2.setBounds(0, 40, 120, 40);
 }
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.swtjface.ch3;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
/**
 * 2010.05.22
 * Composite의 하위 클래스를 보여줄 Viewer
 * 참조 : SWT/JFace in Action
 * @author cremazer
 *
 */
public class CompositeViewer extends ApplicationWindow {
    
 public CompositeViewer() {  
  super(null);
 }
 
 protected Control createContents(Composite parent){
  getShell().setText("SashForm Example");
  parent.setSize(400, 250);
  
  //SashForm 객체를 Composite 안에 생성한다.
  Ch3_SashForm sf = new Ch3_SashForm(parent);
  
  return parent;
 }
 
 public static void main(String[] args) {
  CompositeViewer compViewer = new CompositeViewer();
  compViewer.setBlockOnOpen(true);
  compViewer.open();
  Display.getCurrent().dispose(); 
 }
}



 <결과>





TabFolder 클래스


  TabFolder 클래스는 Composite의 기능을 확장하여 여러 개의 Composite 객체를 하나의 컨테이너에 담을 수 있습니다. 아래의 메서드를 통해 TabItem에 대한 정보를 얻을 수 있습니다.


  •   getItemCount() : TabFolder의 TabItem 수를 반환합니다. 
  •   getItems() : TabItem 객체의 배열을 반환합니다. 
  •   getSelection() : 사용자가 어떤 TabItem을 선택했는지 알려줍니다. 
  •   setSelection() : 선택될 탭을 설정합니다.




<예제 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.swtjface.ch3;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
 
/**
 * 2010.05.22
 * Composite의 하위 클래스를 보여줄 Viewer
 * 참조 : SWT/JFace in Action
 * @author cremazer
 *
 */
public class CompositeViewer extends ApplicationWindow {
    
 public CompositeViewer() {  
  super(null);
 }
 
 protected Control createContents(Composite parent){
  getShell().setText("TabFolder Example");
  parent.setSize(400, 250);
  
  //TabFolder 객체를 Composite 안에 생성한다.
  TabFolder tf = new TabFolder(parent, SWT.NONE);
  
//  TabItem ti = new TabItem(tf, SWT.NONE);
//  ti.setText("Tab1");
  
  //TabItem의 개수 설정
  TabItem[] ti = new TabItem[3];
  
  //TabItem을 Tabfolder에 생성
  for(int i = 0 ; i < ti.length ; i++){
   ti[i] = new TabItem(tf, SWT.NONE);
   ti[i].setText("Tab" + (i+1));
  }
  
  return parent;
 }
 
 public static void main(String[] args) {
  CompositeViewer compViewer = new CompositeViewer();
  compViewer.setBlockOnOpen(true);
  compViewer.open();
  Display.getCurrent().dispose(); 
 }
}



<결과>




통합예제


이제 Composite, Group, SashForm, TabFolder를 모두 적용하여 WidgetWindow를 구현하는 예제를 살펴 보겠습니다. 

WidgetWindow의 GUI 구조는 아래와 같이 각 컴포넌트를 포함한 Composite를 이용하여 화면을 구성할 수 있습니다.



WidgetWindow 구조





<예제 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.swtjface.ch3;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
 
/**
 * 2010.05.22
 * Group과 SashForm 객체를 담을 Composite 객체 생성
 * @author cremazer
 *
 */
public class Ch3_Composite extends Composite {
 public Ch3_Composite(Composite parent) {
  super(parent, SWT.NONE);
  
  parent.getShell().setText("Composite");
  
  Ch3_Group gp = new Ch3_Group(this);
  gp.setLocation(0, 0);
  gp.pack();
  
  Ch3_SashForm sf = new Ch3_SashForm(this);
  sf.setLocation(125, 25);
  sf.pack();
 }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.swtjface.ch3;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
 
/**
 * 2010.05.22
 * WidgetWindow 생성 
 * @author cremazer
 */
public class WidgetWindow extends ApplicationWindow {
    
 public WidgetWindow(){
  super(null);
 }
 
 protected Control createContents(Composite parent){
  
  TabFolder tf = new TabFolder(parent, SWT.NONE);
  
  TabItem ti = new TabItem(tf, SWT.NONE);
  ti.setText("Tab1");
  ti.setControl(new Ch3_Composite(tf));
  
  getShell().setText("Widget Window");
  return parent;
 }
 
 public static void main(String[] args) {
  WidgetWindow wwin = new WidgetWindow();
  wwin.setBlockOnOpen(true);
  wwin.open();
  Display.getCurrent().dispose();
 }
}


<결과>




 참고 서적 : SWT/JFace in Action



댓글 없음:

댓글 쓰기