質問
最初のページの選択に応じて 2 ページ目の内容が変わるウィザードが必要です。最初のページでは、作成したいフィルターの「種類」をユーザーに尋ね、2 番目のページでは、選択した「種類」のフィルター インスタンスを 1 つ作成するようにユーザーに求めます。
JFace のウィザード ページのコンテンツ (createControl(...) メソッド) はすべて、特定のページが表示されたときではなく、ウィザードが開いているときに作成されます (これにより、JFace はウィザードのサイズを知ることができるようになります??)。
このため、ウィザードを開く前に 2 番目のページのコンテンツを作成する必要がありますが、2 番目のページのコンテンツは最初のページの選択に依存するため、作成できません。
今のところ、私が見つけたよりクリーンな解決策は、ウィザードが開く前に (コンテンツを含む) すべての (数秒) ページを作成し、最初のページの実装で getNextPage() メソッドをオーバーライドすることです。
このソリューションの主な欠点は、作成する 2 ページ目が多数ある場合にコストが高くなる可能性があることです。
その解決策についてどう思いますか?ウィザードのページはどのように管理していますか?私が見逃していたよりクリーンな解決策はありますか?
解決
他のいくつかのページにいる場合、このアプローチは正しいです。
- まったく違うもの
- 前のページで行った選択に応じて異なります
そうすれば、できます 次のページを動的に追加します (としても ここで説明されています)
ただし、動的なコンテンツを含む次のページだけがある場合は、そのコンテンツを onEnterPage()
方法
public void createControl(Composite parent)
{
//
// create the composite to hold the widgets
//
this.composite = new Composite(parent, SWT.NONE);
//
// create the desired layout for this wizard page
//
GridLayout layout = new GridLayout();
layout.numColumns = 4;
this.composite.setLayout(layout);
// set the composite as the control for this page
setControl(this.composite);
}
void onEnterPage()
{
final MacroModel model = ((MacroWizard) getWizard()).model;
String selectedKey = model.selectedKey;
String[] attrs = (String[]) model.macroMap.get(selectedKey);
for (int i = 0; i < attrs.length; i++)
{
String attr = attrs[i];
Label label = new Label(this.composite, SWT.NONE);
label.setText(attr + ":");
new Text(this.composite, SWT.NONE);
}
pack();
}
日食コーナーの記事にあるように JFace ウィザードの作成:
ウィザード ページの getNextPage メソッドを上書きすることで、ウィザード ページの順序を変更できます。ページを離れる前に、ユーザーが選択した値をモデルに保存します。この例では、旅行の選択に応じて、次にユーザーには航空券のページまたは車での旅行のページが表示されます。
public IWizardPage getNextPage(){
saveDataToModel();
if (planeButton.getSelection()) {
PlanePage page = ((HolidayWizard)getWizard()).planePage;
page.onEnterPage();
return page;
}
// Returns the next page depending on the selected button
if (carButton.getSelection()) {
return ((HolidayWizard)getWizard()).carPage;
}
return null;
}
私たちは この初期化を行うメソッドを定義します。 PlanePage
, onEnterPage()
に移動するときにこのメソッドを呼び出します。 PlanePage
, 、それは getNextPage()
最初のページのメソッド.
他のヒント
あなたが最初のページにあなたの選択に基づいて新しいウィザードを起動したい場合は、
以下の例では、拡張ポイントによって定義された利用可能なウィザードのリストを示します。 押すと、<私>次へには、選択したウィザードが開始されます。
public class ModelSetupWizardSelectionPage extends WizardSelectionPage {
private ComboViewer providerViewer;
private IConfigurationElement selectedProvider;
public ModelSetupWizardSelectionPage(String pageName) {
super(pageName);
}
private class WizardNode implements IWizardNode {
private IWizard wizard = null;
private IConfigurationElement configurationElement;
public WizardNode(IConfigurationElement c) {
this.configurationElement = c;
}
@Override
public void dispose() {
}
@Override
public Point getExtent() {
return new Point(-1, -1);
}
@Override
public IWizard getWizard() {
if (wizard == null) {
try {
wizard = (IWizard) configurationElement
.createExecutableExtension("wizardClass");
} catch (CoreException e) {
}
}
return wizard;
}
@Override
public boolean isContentCreated() {
// TODO Auto-generated method stub
return wizard != null;
}
}
@Override
public void createControl(Composite parent) {
setTitle("Select model provider");
Composite main = new Composite(parent, SWT.NONE);
GridLayout gd = new GridLayout(2, false);
main.setLayout(gd);
new Label(main, SWT.NONE).setText("Model provider");
Combo providerList = new Combo(main, SWT.NONE);
providerViewer = new ComboViewer(providerList);
providerViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof IConfigurationElement) {
IConfigurationElement c = (IConfigurationElement) element;
String result = c.getAttribute("name");
if (result == null || result.length() == 0) {
result = c.getAttribute("class");
}
return result;
}
return super.getText(element);
}
});
providerViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (!selection.isEmpty()
&& selection instanceof IStructuredSelection) {
Object o = ((IStructuredSelection) selection)
.getFirstElement();
if (o instanceof IConfigurationElement) {
selectedProvider = (IConfigurationElement) o;
setMessage(selectedProvider.getAttribute("description"));
setSelectedNode(new WizardNode(selectedProvider));
}
}
}
});
providerViewer.setContentProvider(new ArrayContentProvider());
List<IConfigurationElement> providers = new ArrayList<IConfigurationElement>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = registry
.getExtensionPoint(<your extension point namespace>,<extension point name>);
if (extensionPoint != null) {
IExtension extensions[] = extensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement configurationElements[] = extension
.getConfigurationElements();
for (IConfigurationElement c : configurationElements) {
providers.add(c);
}
}
}
providerViewer.setInput(providers);
setControl(main);
}
、対応するウィザードクラスは次のようになります:
public class ModelSetupWizard extends Wizard {
private ModelSetupWizardSelectionPage wizardSelectionPage;
public ModelSetupWizard() {
setForcePreviousAndNextButtons(true);
}
@Override
public boolean performFinish() {
// Do what you have to do to finish the wizard
return true;
}
@Override
public void addPages() {
wizardSelectionPage = new ModelSetupWizardSelectionPage("Select a wizard");
addPage(wizardSelectionPage);
}
}
別の方法としては、@Override <のhref = "http://help.eclipse.org/mars/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/dialogs/にありますDialogPage.html#のsetVisible-boolean-」のrel = "nofollowをnoreferrer">のsetVisible を。あなたは、ページの値を更新するか、またはその時点で追加のウィジェットを追加することができます。
私は別の解決策を持っています。
ページが1ページの結果に依存して、変数を作成し、そのウィザードページがユーザーからオプションを持っている場合、最初のページににそれを渡すと、、そのページが閉じられる前の最後の事はに変数を設定することです必要な値ます。
そして、その後、ウィザードの次のページに渡し、ウィザードへこの変数を渡します。文と、そのようにあなたが一緒に両方の選択肢を取得する場合は、簡単な操作を行います。
ほとんどのコードでユーザーオプションの唯一の小さな違いがあることに注意してくださいので、あなたのコードを複製するに行き詰まるしないように覚えています。