ウィンドウ
2003.04.10 update.

ウィンドウを生成・制御します。

Display display = new Display();
Shell shell = new Shell(display);

として、「shell」より、一番基底にあるウィンドウを管理していきます。
以下のような感じで制御します。
なお、ヘッダ部に以下のimportの指定が必要です。

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.*;


Display display = new Display();
Shell shell = new Shell(display);

//ウィンドウのタイトルを指定
shell.setText("swtTest");

FillLayout layout = new FillLayout(SWT.VERTICAL);
shell.setLayout(layout);

Label label = new Label(shell,SWT.BORDER);
label.setText("Hello World!!");

//ウィンドウのサイズを指定
shell.setLocation(100,10);
shell.setSize(300,100);

//イベントループ
shell.open();
while(!shell.isDisposed()){
  if (!display.readAndDispatch()){
    display.sleep();
  }
}
		
//破棄処理
display.dispose();


「shell.setLocation」でウィンドウの表示位置を指定し、 「shell.setSize」でウィンドウサイズを 指定しています。
画面(スクリーン)一番の左上が(0,0)となります。
その後のイベントループは、ウィンドウが閉じられるまでは このwhileのループからは抜けません。
ウィンドウが閉じられたときに、「display.disose()」にて破棄処理をしています。

ウィンドウスタイルの変更

上記ソースでは、ウィンドウはサイズ変更可能なウィンドウです。
サイズ変更を不可能にするには、Shellの生成時に、
「Shell shell = new Shell(display,SWT.CLOSE | SWT.MIN | SWT.TITLE | SWT.SYSTEM_MODAL);」 にて可能です。
デフォルト(第二引数を省略した場合)は、「Shell shell = new Shell(display,SWT.RESIZE | SWT.BORDER | SWT.CLOSE | SWT.MIN | SWT.MAX | SWT.TITLE | SWT.SHELL_TRIM);」のような感じの指定です。
そのほか、最小化を無効にしたり最大化を無効にしたり、閉じるボタンをなくしたり・・とかいろいろできます。

ウィンドウイベントの受け取り

ヘッダ部に「import org.eclipse.swt.events.*;」の指定が必要です。

shellのイベントループをする前に、以下の記述をしておきます。


shell.addShellListener(new ShellListener() {
  public void shellActivated(ShellEvent e){
    System.out.println("ウィンドウのアクティブ化");
  }
  public void shellClosed(ShellEvent e){
    System.out.println("ウィンドウが閉じられた");
  }
  public void shellDeactivated(ShellEvent e){
    System.out.println("ウィンドウの非アクティブ化");
  }
  public void shellDeiconified(ShellEvent e){
    System.out.println("ウィンドウの最小化を復帰");
  }
  public void shellIconified(ShellEvent e){
    System.out.println("ウィンドウの最小化");
  }
});


この「ShellListener」により、ウィンドウの各種イベントを取得します。
イベントが発生した場合、この各メソッドが呼ばれることになります(上記ではコマンドラインにメッセージが表示されます)。
なお、「ShellListener」はinterface型ですので、内容がカラでもすべてのメソッドの指定(継承)が必要です。

基本的に、JavaのSwingも(もちろんSWTも)、このようなイベントの受け取り方ですので、 このスタイルは覚えておいてください。

ウィンドウのサイズ変更・位置移動イベントの受け取り

これも、同じようにリスナーを登録することで実装します。


shell.addControlListener(new ControlListener() {
  public void controlMoved(ControlEvent e){
    System.out.println("ウィンドウが移動");
  }
  public void controlResized(ControlEvent e){
    System.out.println("ウィンドウのリサイズ");
  }
});


もう、やり方はおわかりですね。
同じ感じです。