2014년 1월 16일 목요일

SWT - FormLayout




폼 레이아웃(FormLayout)


폼 레이아웃은 서로 크기가 다른 컨트롤을 가지고 있으면서도 크기가 조정되는 폼을 생성하기 위해 사용합니다. 

폼 레이아웃은 FormData 클래스를 사용하여 각각의 컨트롤을 설정할 수 있습니다. 컨트롤을  배치하는 방법은 FormAttachment 클래스를 사용하여 각 컨트롤들의 위치를 명시하여 사용합니다. 



▶ 예제코드



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
package com.swtjface.Ch6;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
 
public class Ch6FormLayoutComposite extends Composite {
 
  public Ch6FormLayoutComposite(Composite parent) {
  super(parent, SWT.NONE);
 
   FormLayout layout = new FormLayout();
  setLayout(layout);
 
   //텍스트를 왼쪽 상단에 위치
  Text t = new Text(this, SWT.MULTI);
  FormData data = new FormData();
  data.top = new FormAttachment(0, 0);
  data.left = new FormAttachment(0, 0);
  data.width = 200;
  data.height = 200;
  t.setLayoutData(data);
 
   //확인 버튼
  Button ok = new Button(this, SWT.NONE);
  ok.setText("Ok");
 
   //취소 버튼
  Button cancel = new Button(this, SWT.NONE);
  cancel.setText("Cancel");
 
   //확인 버튼 위치 설정
  data = new FormData();
  //텍스트 영역 바로 아래 있어야 한다.
  data.top = new FormAttachment(t);
  //취소 버튼 왼쪽에 있어야 한다.
  data.right = new FormAttachment(cancel);
  ok.setLayoutData(data);
 
   //취소 버튼 위치 설정
  data = new FormData();
  data.top = new FormAttachment(t);
  data.right = new FormAttachment(100);
  cancel.setLayoutData(data);
 }
}



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
package com.swtjface.Ch6;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
public class FormLayoutTest extends ApplicationWindow {
 public FormLayoutTest() {
  super(null);
 }
 
  protected Control createContents(Composite parent) {
  Ch6FormLayoutComposite ca = new Ch6FormLayoutComposite(parent);
 
   getShell().setText("Widget Window");
  return parent;
 }
 
  public static void main(String[] args) {
  FormLayoutTest tc = new FormLayoutTest();
  tc.setBlockOnOpen(true);
  tc.open();
  Display.getCurrent().dispose();
 }
 
}



▶ 실행결과






SWT - GridLayout




그리드 레이아웃(GridLayout)


그리드 레이아웃은 행 레이아웃(RowLayout)의 모델을 기반으로 여러개의 행과 열을 사용할 수 있습니다. 


GridLayout의 생성자는 두 개의 매개 변수를 가집니다. 첫 번째 매개 변수는 열의 개수를 의미하여, 두 번째 매개 변수는 열의 공간을 균등하게 사용할지에 대한 부울 값입니다. 두 번째 매개 변수에 false를 설정하면, 각 열에 대해 필요한 최소한의 공간만을 사용하는 것입니다.



▶ 예제코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.swtjface.Ch6;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
 
public class Ch6GridLayoutComposite extends Composite {
 
  public Ch6GridLayoutComposite(Composite parent) {
  super(parent, SWT.NONE);
 
   GridLayout layout = new GridLayout(4, false);
  setLayout(layout);
  for (int i = 0; i < 16; ++i) {
   Button button = new Button(this, SWT.NONE);
   button.setText("Cell " + (i<10?"0"+i:i));
  }
 }
}




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
package com.swtjface.Ch6;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
public class GridLayoutTest extends ApplicationWindow {
 public GridLayoutTest() {
  super(null);
 }
 
  protected Control createContents(Composite parent) {
  Ch6GridLayoutComposite ca = new Ch6GridLayoutComposite(parent);
 
   getShell().setText("Widget Window");
  return parent;
 }
 
  public static void main(String[] args) {
  GridLayoutTest tc = new GridLayoutTest();
  tc.setBlockOnOpen(true);
  tc.open();
  Display.getCurrent().dispose();
 }
 
}



▶ 실행결과







SWT - RowLayout




행 레이아웃(RowLayout)


행 레이아웃은 여러개의 선반처럼 여러 줄로 구성할 수 있습니다. 디폴트는 자식 컨트롤을 하나의 줄에 넣습니다. 여러 줄로 사용하려면 SWT.WRAP 을 인자로 넣어줘야 합니다.

레이아웃의 자식 컨트롤의 크기를 제어하려면 RowData 클래스를 이용할 수 있습니다. 자식 컨트롤의 setLayoutData() 메서드는 LayoutData의 인스턴스를 취하는데, RowData는 LayoutData로부터 파생되었습니다. 

아래의 예제는 RowLayout에 컨트롤의 크기를 규칙적으로 변화시켜 어떻게 배치되는지 보여주는 예제입니다.



▶ 예제코드



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
package com.swtjface.Ch6;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
 
public class Ch6RowLayoutComposite extends Composite {
 
  public Ch6RowLayoutComposite(Composite parent) {
  super(parent, SWT.NONE);
 
   /*
   * RowLayout 생성자의 default 는 1행으로 버튼들을 추가한다.
   * SWT.WRAP 속성을 추가하면 1열로 버튼들을 추가한다.
   */
  RowLayout layout = new RowLayout(SWT.HORIZONTAL|SWT.WRAP);
  setLayout(layout);
  for (int i = 0; i < 16; ++i) {
   Button button = new Button(this, SWT.NONE);
   button.setText("Sample Text");
   button.setLayoutData(new RowData(200 + 5 * i, 20 + i));
  }
 }
}




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
package com.swtjface.Ch6;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
public class RowLayoutTest extends ApplicationWindow {
 public RowLayoutTest() {
  super(null);
 }
 
  protected Control createContents(Composite parent) {
  Ch6RowLayoutComposite ca = new Ch6RowLayoutComposite(parent);
  
  getShell().setText("Widget Window");
  return parent;
 }
 
  public static void main(String[] args) {
  RowLayoutTest tc = new RowLayoutTest();
  tc.setBlockOnOpen(true);
  tc.open();
  Display.getCurrent().dispose();
 }
 
}



▶ 실행결과





결과 창의 아래 부분을 줄이면 자식 컨트롤들이 동적으로 위치를 바꿔 배열됩니다.







SWT - FillLayout




필 레이아웃(FillLayout)


필 레이아웃은 책을 쌓아 올리는 것과 유사한 방법의 레이아웃이며, 자식 컨트롤을 같은 간격으로 배치하여 Composite 내의 빈 공간을 채우는 간단한 레이아웃입니다.

Composite의 setLayout() 메서드는 자식 컨트롤을 배열하려고 하는 Composite와 레이아웃을 연결하는데 사용합니다.

FillLayout의 생성자는 매개 변수 없이 호출하거나 하나의 스타일 매개 변수와 함께 호출할 수 있습니다. 디폴트 생성자는 SWT.HORIZONTAL 스타일을 사용하며, 스타일 매개 변수는 2종류로 나뉘어 집니다.


  • SWT.HORIZONTAL : 왼쪽에서 오른쪽으로 배열합니다. 가로 정렬
  • SWT.VERTICAL : 위에서 아래로 배열합니다. 세로 정렬




▶ 예제코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.swtjface.Ch6;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
 
public class Ch6FillLayoutComposite extends Composite {
 
  public Ch6FillLayoutComposite(Composite parent) {
  super(parent, SWT.NONE);
 
//  FillLayout layout = new FillLayout(SWT.VERTICAL);
  FillLayout layout = new FillLayout(SWT.HORIZONTAL);
  setLayout(layout);
  for (int i = 0; i < 8; ++i) {
   Button button = new Button(this, SWT.NONE);
   button.setText("Sample Text");
  }
 }
}




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
package com.swtjface.Ch6;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
public class FillLayoutTest extends ApplicationWindow {
 public FillLayoutTest() {
  super(null);
 }
 
  protected Control createContents(Composite parent) {
  Ch6FillLayoutComposite flc = new Ch6FillLayoutComposite(parent);
 
   getShell().setText("Widget Window");
  return parent;
 }
 
  public static void main(String[] args) {
  FillLayoutTest tc = new FillLayoutTest();
  tc.setBlockOnOpen(true);
  tc.open();
  Display.getCurrent().dispose();
 }
 
}



▶ 실행결과


SWT.VERTICAL 의 경우



SWT.HORIZONTAL 의 경우





2014년 1월 15일 수요일

SWT - ProgressIndicator




ProgressIndicator


ProgressIndicator 위젯은 프로그레서바를 보일 때 진행상태를 어떻게 채워나가야 하는지를 크게 신경쓰지 않도록 해줍니다. ProgressIndicator는 수행하기를 기대하는 작업의 전체량으로 초기화하고, 작업이 끝났을 때, 이를 통지하면 됩니다.

ProgressIndicator indicator = new ProgressIndicator(parent);
...
//전체 작업량 설정
indicator.beginTask(1000);
...
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
//작업 완료량 설정
indicator.worked(1);
}
});



  1. ProgressIndicator를 사용하려면 컨트롤에게 전체 작업량이 얼마인지 알려주기 위해 beginTask() 메서드를 호출합니다. 
  2. 그 다음, worked() 메서드를 매번 호출하여 작업이 어느 정도 완료됐음을 알려줍니다.




▶ 예제코드

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
53
54
55
package com.swtjface.Ch5;
 
import org.eclipse.jface.dialogs.ProgressIndicator;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
/**
 * ProgressIndicator 테스트
 *
 * @since 2013. 6. 8.
 * @author Cremazer
 *
 */
public class ProgressIndicatorTest extends ApplicationWindow {
 ProgressIndicator indicator;
 
 public ProgressIndicatorTest() {
  super(null);
 }
 
  public Control createContents(Composite parent) {
  // --- Create the window title. ---
 
   getShell().setText("ProgressIndicator Test");
 
   indicator = new ProgressIndicator(parent);
  indicator.setBounds(10, 10, 200, 32);
 
   //전체 작업량 설정
  indicator.beginTask(1000);
  
  for (int i = 0; i < 1000 ; i++) {
   Display.getCurrent().asyncExec(new Runnable() {
    @Override
    public void run() {
     //작업 완료량 설정
     indicator.worked(1);
    }
   });
  }
  
  return indicator;
 }
 
  public static void main(String[] args) {
  // --- Display CoolBarTest until the window is closed. ---
 
   ProgressIndicatorTest app = new ProgressIndicatorTest();
  app.setBlockOnOpen(true);
  app.open();
  Display.getCurrent().dispose();
 }
}





▶ 실행결과





SWT - ProgressBar



ProgressBar


ProgressBar 컨트롤은 시간이 걸리는 작업의 진행상황을 알려주는 데 사용됩니다.


▶ 예제코드

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
53
54
55
56
57
58
package com.swtjface.Ch5;
 
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.ProgressBar;
 
/**
 * ProgressBar 테스트
 *
 * @since 2013. 6. 8.
 * @author Cremazer
 *
 */
public class ProgressBarTest extends ApplicationWindow {
 ProgressBar bar;
 int cnt = 0;
 
 public ProgressBarTest() {
  super(null);
 }
 
 public Control createContents(Composite parent) {
  // --- Create the window title. ---
 
  getShell().setText("ProgressBar Test");
 
  bar = new ProgressBar(parent, SWT.SMOOTH);
  bar.setBounds(10, 10, 200, 32);
  bar.setMaximum(100);
  
  for (int i = 0; i < 100 ; i++) {
   Display.getCurrent().asyncExec(new Runnable() {
    @Override
    public void run() {
     setSelection();
    }
   });
  }
  
  return bar;
 }
 
 protected void setSelection() {
  bar.setSelection((int)(bar.getMaximum() * (cnt++ +1)/100 ));
 }
 
 public static void main(String[] args) {
  // --- Display CoolBarTest until the window is closed. ---
 
  ProgressBarTest app = new ProgressBarTest();
  app.setBlockOnOpen(true);
  app.open();
  Display.getCurrent().dispose();
 }
}




▶ 실행결과






SWT - 슬라이더(Slider)




슬라이더(Slider)


Slider 컨트롤은 윈도우의 스크롤바와 비슷합니다. 스크롤바는 스크롤하는 항목과 연결되어 있고 해당 문맥 밖에서의 사용은 불가능하지만, Slider는 정수 범위에서의 어떤 값을 선택하기 위한 컨트롤로 사용한다는 점에서 둘은 서로 다릅니다.


  • Slider의 선택값의 범위는 setMinimum()과 setMaximum() 메서드로 설정합니다.
  • 클릭하거나 드래그할 수 있는 사각형 슬라이더는 썸(thumb)이라 합니다.
  • setThumb() 메서드를 통해 썸의 크기를 설정하는 값은 정수여야 합니다.
  • 썸의 크기는 Slider 전체 범위 중 썸의 크기만큼의 비율로 결정됩니다. 만약 범위가 0~100 이고, 썸의 크기가 10 이라면, 썸은 Slider 컨트롤의 10%의 크기가 됩니다.
  • 양쪽 끝의 화살표는 증가분(increment)으로 설정한 만큼 썸을 움직입니다.
  • 썸과 화살표 사이의 공간을 클릭하면 페이지 증가분(pageIncrement)만큼 썸을 이동합니다.


setValues() 메서드는 위에서 언급한 Slider와 연관된 모든 값을 한번에 설정합니다.

/*
 * int selection : 썸(thumb)의 초기위치
 * int minimum : 최소값
 * int maximum : 최대값 
 * int thumb : 썸의 크기
 * int increment : 끝의 화살표 이동값
 * int pageIncrement : 페이지 증가분
 */
setValues(int selection, int minimum, int maximum, int thumb, int increment, int pageIncrement);



▶ 예제코드

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.Ch5;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DragDetectEvent;
import org.eclipse.swt.events.DragDetectListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Slider;
 
/**
 * 슬라이더는 스크롤바와 비슷하다.
 * 
 * @since 2013. 6. 8.
 * @author Cremazer
 * 
 */
public class Ch5Slider extends Composite {
    Label label;
    public Ch5Slider(Composite parent) {
        super(parent, SWT.NONE);
        setLayout(new FillLayout());
        
        label = new Label(this, SWT.CENTER|SWT.BORDER);
        label.setBounds(30,60,110,15);
        
        final Slider slider = new Slider(this, SWT.HORIZONTAL);
        
        /*
         * int selection : 썸(thumb)의 초기위치
         * int minimum : 최소값
         * int maximum : 최대값 
         * int thumb : 썸의 크기
         * int increment : 끝의 화살표 이동값
         * int pageIncrement : 페이지 증가분
         */
        slider.setValues(1000, 400, 1600, 200, 10, 100);
        slider.addDragDetectListener(new DragDetectListener() {
            
            @Override
            public void dragDetected(DragDetectEvent arg0) {
                setText(slider.getSelection());
                
            }
        });
    }
 
    protected void setText(int selection) {
        label.setText(String.valueOf(selection));
    }
}
 



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
package com.swtjface.Ch5;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
/**
 * 슬라이더 테스트
 *
 * @since 2013. 6. 8.
 * @author Cremazer
 *
 */
public class Ch5SliderTest extends ApplicationWindow {
    public Ch5SliderTest() {
        super(null);
    }
 
    protected Control createContents(Composite parent) {
        Ch5Slider slider = new Ch5Slider(parent);
 
        getShell().setText("Widget Window");
        return parent;
    }
 
    public static void main(String[] args) {
        Ch5SliderTest tc = new Ch5SliderTest();
        tc.setBlockOnOpen(true);
        tc.open();
        Display.getCurrent().dispose();
    }
 
}
 


▶ 실행결과







2014년 1월 13일 월요일

SWT - CoolBar




CoolBar


CoolBar는 툴바나 버튼을 관리하는 작업에 사용되며, ToolBar 컨트롤과 비슷하지만, CoolBar는 프로그램이 실행하는 동안 재배치하거나 크기를 조정할 수 있습니다.

CoolBar는 여러개의 CoolItem을 포함하며, CoolItem은 각 기능으로 구분된 ToolBar를 감싸고 있습니다.




CoolItem은 왼쪽 끝에 핸들을 가지고 있습니다. 핸들을 더블클릭하면 CoolItem은 CoolBar의 최대한의 넓이로 확장되며, 최소한으로 축소되기도 합니다. 핸들을 드래그하면 CoolBar의 다른 부분으로 이동할 수 있습니다.


아래는 3개의 CoolItem으로 이루어진 CoolBar 예제입니다.



▶ 예제코드

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
53
54
55
56
package com.swtjface.Ch5;
 
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
 
public class CoolBarTest extends ApplicationWindow {
    public CoolBarTest() {
        super(null);
    }
 
    protected Control createContents(Composite parent) {
        // --- Create the window title. ---
 
        getShell().setText("CoolBar Test");
 
        String asCoolItemSection[] = { "File""Formatting""Search" };
        CoolBar composite = new CoolBar(parent, SWT.NONE);
        
        for (int idxCoolItem = 0; idxCoolItem < 3; ++idxCoolItem) {
            CoolItem item = new CoolItem(composite, SWT.NONE);
            ToolBar tb = new ToolBar(composite, SWT.FLAT);
            
            for (int idxItem = 0; idxItem < 3; ++idxItem) {
                ToolItem ti = new ToolItem(tb, SWT.NONE);
                ti.setText(asCoolItemSection[idxCoolItem] + " Item #" + idxItem);
            }
            
            Point p = tb.computeSize(SWT.DEFAULT, SWT.DEFAULT);
            tb.setSize(p);
            
            Point p2 = item.computeSize(p.x, p.y);
            item.setControl(tb);
            item.setSize(p2);
        }
        
        return composite;
    }
 
    public static void main(String[] args) {
        // --- Display CoolBarTest until the window is closed. ---
 
        CoolBarTest app = new CoolBarTest();
        app.setBlockOnOpen(true);
        app.open();
        Display.getCurrent().dispose();
    }
}
 





▶ 실행결과