SWT Tips and Samples 基礎編 > Wizard

 

Wizard

JFaceのフレームワークを利用するとユーザーからの情報をインタラクティブに入力できるウィザードを簡単に作成できます。ウィザードを実装するには、ウィザードの各ページを管理するWizardクラスと、ページに対応するWizardPageクラスを継承します。

まずWizardクラスを継承して実装すると以下のようになります。このクラスにWizardPageのインスタンスを持たせ、addPagesメソッドをオーバーライドして表示順にページを追加します。またperformFinishメソッドはダイアログのFinishボタンが押されたときに呼び出されるメソッドなので、ここに各ページから値を取り出して最終的な処理をすればよいでしょう。

class MyWizard extends Wizard{
   private Page1 page1;
   private Page2 page2;
   ...
   public MyWizard(){
      super();
      ...
   }
   public void addPages(){
      page1 = new Page1(...);
      page2 = new Page2(...);
      addPage(page1);
      addPage(page2);
   }
   //ウィザードダイアログのFinishボタンが押されたときに呼び出される
   public boolean performFinish(){
      //各ページより必要な情報を取り出す
      String v1 = page1.get...;
      String v2 = page2.get...;
      ...
   }
}

次に各WizardPageの実装を行います。コンストラクタでダイアログのタイトルやメッセージの設定を行います。またsetPageCompleteメソッドは入力の完了状況を決めるメソッドで、trueをセットするとウィザードダイアログのFinishボタンがアクティブになります。ページ内のウィジェットの配置はcreateControlメソッドをオーバーライドすることで行います。WizardPageには、入力時のエラー情報を表示するメソッドも用意されており、下のようにTextウィジェットにModifyListenerを追加して、誤った情報を入力したときにダイアログ上部にエラーメッセージを表示することもできます。この場合Textウィジェットに何らかの変更が行われた場合、modifyTextが呼び出され入力内容の検証結果に応じてエラーメッセージをダイアログに表示します。また各WizardPageはそのページ内で入力された情報を保持し、最終的にWizardクラスにその情報を渡さなければなりません。そこでgetValueのようなgetメソッドを用意しておきます。

class Page1 extends WizardPage{
   private Text text;
   public Page1(){
      super("page1");
      setTitle("...");
      setMessage("...");
      setPageComplete(false);
   }
   public void createControl(){
      Composite c = new Composite(...);
      ...
      text = new Text(c, ...);
      text.addModifyListener(new ModifyListener(){
         public void modifyText(ModifyEvent e){
            if (getValue().getLength() == 0){
                updateStatus("文字を入力してください");
                return;
            }
            updateStatus(null);
         }
      });
      ...
      setControl(c);
   }
   public String getValue(){
      return text.getText();
   }
   private void updateStatus(String msg){
      setErrorMessage(msg);
      setPageComplete(msg == null);
   }
}

class Page2 extends WizardPage{
   ...
}

最後にウィザードダイアログの表示です。

//ウィザードのダイアログを表示する
MyWizard wiz = new MyWizard(...);
WizardDialog dialog = new WizardDialog(shell, wiz);
dialog.open();

サンプルプログラム

このサンプルは、学生情報を入力するためのウィザードです。学籍番号や氏名を入力しないとエラーメッセージが表示されます。すべての入力がなされると、NextボタンやFinishボタンがアクティブになり、次のページに進むか、入力を完了することができます。

ソースコード (WizardTest.java)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class WizardTest extends ApplicationWindow {

        private List list;

        public WizardTest() {
                super(null);

        }
        public static void main(String[] args) {
                ApplicationWindow w = new WizardTest();
                w.setBlockOnOpen(true);
                w.open();
                Display.getCurrent().dispose();
        }

        protected Control createContents(Composite parent) {
                getShell().setText("WizardTest");
                Composite container = new Composite(parent, SWT.NONE);
                
                container.setLayout(new RowLayout(SWT.VERTICAL));

                Button b = new Button(container, SWT.PUSH);
                b.setText("学生の追加");
                b.addSelectionListener(new SelectionAdapter(){
                   public void widgetSelected(SelectionEvent e) {
                      NewStudentWizard wiz = new NewStudentWizard(list);
                      WizardDialog dialog = new WizardDialog(getShell(), wiz);
                      dialog.open();
                   }
                });
                
                list = new List(container, SWT.SINGLE | 
                                                    SWT.BORDER | 
                                                    SWT.V_SCROLL | 
                                                    SWT.H_SCROLL);
                RowData rd = new RowData(200,100);
                list.setLayoutData(rd);
                
                return container;
        }       
}

class NewStudentWizard extends Wizard{
        
        private StudentPage1 page1;
        private StudentPage2 page2;
        private List list;
        
        public NewStudentWizard(List l){
                super();
                setNeedsProgressMonitor(true);
                this.list = l;
        }
        
        public boolean performFinish() {
                String id = page1.getID();
                String name = page1.getName();
                String gender = page1.getGender();
                String comment = page2.getComment();
                System.out.println("学生が追加されました。");
                System.out.println(id + ":" + name + ":" + 
                                   gender + ":" + comment);
                list.add(id + " " + name);
                return true;
        }
                
        public void addPages() {
                page1 = new StudentPage1();
                page2 = new StudentPage2();
                addPage(page1);
                addPage(page2);
        }
}

class StudentPage1 extends WizardPage implements ModifyListener{
        
        private Text textID;
        private Text textName;
        private Combo comboGender;
        private static Pattern idPattern = Pattern.compile("[0-9]{4}");

        protected StudentPage1() {
                super("基本学生情報の入力");
                setTitle("基本学生情報の入力");
                setMessage("学生情報を入力してください。");
                setPageComplete(false);
        }

        public void createControl(Composite parent) {
                Composite c = new Composite(parent, SWT.NONE);
                c.setLayout(new GridLayout(2, false));
                GridData gd;
                
                //学籍番号
                new Label(c, SWT.NONE).setText("学籍番号(&I):");
                textID = new Text(c, SWT.SINGLE | SWT.BORDER);
                gd = new GridData(GridData.FILL_HORIZONTAL);
                textID.setLayoutData(gd);
                textID.addModifyListener(this);
                
                //氏名
                new Label(c, SWT.NONE).setText("氏名(&N):");
                textName = new Text(c, SWT.SINGLE | SWT.BORDER);
                gd = new GridData(GridData.FILL_HORIZONTAL);
                textName.setLayoutData(gd);
                textName.addModifyListener(this);
                
                //性別
                new Label(c, SWT.NONE).setText("性別(&G):");
                comboGender = new Combo(c, SWT.DROP_DOWN | 
                                                   SWT.READ_ONLY);
                comboGender.add("男");
                comboGender.add("女");
                gd = new GridData(GridData.FILL_HORIZONTAL);
                comboGender.setLayoutData(gd);
                comboGender.addModifyListener(this);
                
                setControl(c);
        }
        public String getID() {
                return textID.getText();
        }

        public String getName() {
                return textName.getText();
        }
        public String getGender(){
                int index = comboGender.getSelectionIndex();
                if (index == -1){
                        return "";
                }
                return comboGender.getItem(index);
        }

        public void modifyText(ModifyEvent e) {
                Matcher m = idPattern.matcher(getID());
                if (!m.matches()){
                        updateStatus("数字4桁の学籍番号を入力してください。");
                        return;
                }
                if (getName().length()==0){
                        updateStatus("氏名を入力してください。");
                        return;
                }
                if (getGender().length() == 0){
                        updateStatus("性別をえらんでください。");
                        return;
                }
                updateStatus(null);
        }
        private void updateStatus(String str){
                setErrorMessage(str);
                
                //エラーメッセージが表示されていない場合のみNextボタンと
                //Finishボタンはアクティブになる
                setPageComplete(str == null);
        }
}

class StudentPage2 extends WizardPage{

        private Text textComment;

        protected StudentPage2() {
                super("詳細学生情報の入力");
                setTitle("詳細情報の入力");
                //setMessage("コメントを入力してください。");
                setPageComplete(true);
        }

        public void createControl(Composite parent) {
                Composite c = new Composite(parent, SWT.NONE);
                c.setLayout(new GridLayout(1, false));
                GridData gd;
                
                new Label(c, SWT.NONE).setText("コメント(&C):");
                textComment = new Text(c, SWT.MULTI | SWT.BORDER);
                gd = new GridData(GridData.FILL_BOTH);
                textComment.setLayoutData(gd);
                setControl(c);
        }
        public String getComment(){
                return textComment.getText();
        }
        
        //前ページから値を得て現在のページに反映させたい場合は、
        //setVisibleをオーバーライドすればよい。
        public void setVisible(boolean visible) {
                NewStudentWizard wiz = (NewStudentWizard)getWizard();
                StudentPage1 page = (StudentPage1)wiz.getPreviousPage(this);
                setMessage(page.getName() + " のコメントを入力してください");
                super.setVisible(visible);
        }
}


最新更新日: 2004年7月14日
 
関連リンク
Eclipse API ドキュメント
Wizard
WizardPage
WizardDialog
IBM Developer Works - JFaceウィザードの開発

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送