SWT Tips and Samples 基礎編 > Wizard |
|
WizardJFaceのフレームワークを利用するとユーザーからの情報をインタラクティブに入力できるウィザードを簡単に作成できます。ウィザードを実装するには、ウィザードの各ページを管理する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日 |
- PR -
【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!
オフィス用品・オフィス家具 価 格 交 渉 可!
|
||||
|
|||||
Copyright(C) 2003,2004 Jasmin Project. All Right Reserved. |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||