Java Wizard Next liefert nicht nächste Seite

mausweazle

Lt. Commander
Registriert
Mai 2008
Beiträge
1.633
Hallihallo liebe Community,

ich muss ehrlich sagen, dass meine Frage eine Anfängerfrage ist und ich noch nicht viel mit Java Wizards gearbeitet habe.
Ich will einfach nur von meiner ersten Wizard-Page zur zweiten Wizard-Page gelangen. Gibt es dabei irgendeinen Trick, den ich übersehen habe? (Bestimmt)

Das Problem dabei ist, sobald ich auf der ersten Seite auf "NEXT" klicke, bekomme ich auf der zweiten Seite das Layout der ersten Seite angezeigt. ABER: Die Beschreibung und der Titel der zweiten Seite ändern sich (mit setTitle und setDescription). Also ich sehe beispielsweise nicht das Label-Feld "This is a check" auf der zweiten Seite.

Also was habe ich bis jetzt geschrieben:

im Wizard selbst:
Code:
	@Override
	public IWizardPage getNextPage(IWizardPage currentPage) {
		if (currentPage == page1){
			return page2;
		}
		return null;
	}

erste Page:
Code:
	public DecisionWizardPage1(ISelection selection) {
		super("Seite1");
		this.sel = selection;
		setTitle("Design-Elemente festlegen");
		setDescription("Überprüfen Sie, ob die ausgewählten Modellelemente richtig sind");
	}

	@Override
	public void createControl(Composite parent) {
		
		GridLayout globalGL = new GridLayout();
		globalGL.numColumns = 2;
		
		container = new Composite(parent, SWT.NONE);
		container.setLayout(globalGL);
		
		
		// ein paar Buttons, Listen und Textfelder
		createClassSelection();
		createDecisionSelection();
		createOldDecisionSelection();
		
		container.setLayoutData(gd);

		setControl(container); 
		//setPageComplete(false);
	}
zweite Seite:
Code:
	public DecisionWizardPage2() {
		super("Seite2");
		setTitle("Second Page");
		setDescription("Zweite Seite des Wizards");
		//setControl(text1);
	}

@Override
	public void createControl(Composite parent) {
		container = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		container.setLayout(layout);
		layout.numColumns = 2;
		Label label1 = new Label(container, SWT.NONE);
		label1.setText("Say hello to Fred");

		text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
		text1.setText("");
		
		text1.addKeyListener(new KeyListener() {
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				if (!text1.getText().isEmpty()) {
					setPageComplete(true);
				}
				
			}
		});
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		text1.setLayoutData(gd);
		Label labelCheck = new Label(container, SWT.NONE);
		labelCheck.setText("This is a check");
		Button check = new Button(container, SWT.CHECK);
		check.setSelection(true);
		
		setControl(container);
		setPageComplete(true);

	}


Ich habe auch schon versucht die getNextPage() Methode der WizardPages zu überschreiben, statt getNextPage(IWizardPage currentPage) aus dem eigentlichen Wizard. Aber egal was ich mache, es wird immer das Layout der ersten Seite angezeigt. Es ändert sich nur der Titel und die Beschreibung!


Ich hoffe, ihr könnt mir helfen!

Mit freundlichen Grüßen
Mausweazle
 
Meine Vermutung liegt darin, dass

Code:
Label label1 = new Label(container, SWT.NONE);
label1.setText("Say hello to Fred");

in der Methode erzeugt wird und beim Verlassen der Methode wieder gekillt wird. Sprich er erzeugt es aber zerstört es gleich wieder.

Es sollte helfen wenn du das Label außerhalb der Methode definierst und die Instanzierung in der Methode machst.

Code:
Label label1;

public void Methode() {
   label1 = new Label(container, SWT.NONE);
   label1.setText("Say hello to Fred");
}
 
Das hat leider mein Problem nicht gelöst!

Wenn das die Lösung gewesen wäre, hätte der Wizard ja auf der ersten Seite auch keine Elemente angezeigt, da die Labels, Listen und anderen Dinge dort auch keine Klassenweiten Variablen sind (gut, das konnte man jetzt anhand meines Codeschnippsels nicht erkennen).
 
Finde ich ohne den glue code dazwischen nicht nachvollziehbar genug, um dir zu sagen, wo der Fehler liegt. Ich sehe z.B. nicht den "NEXT"-Button und was er tut. Ich sehe auch nicht, was pageComplete für eine Auswirkung hat, da es nirgends abgefragt wird.

Abgesehen davon würde ich dir für deinen Anwendungsfall zu einem CardLayout raten.

Nebenbei sei angemerkt, dass deine Methode getNextPage keinen sauberen Eindruck macht. Zum einen ist es semantisch nicht sinnvoll null zu returnen. Generell ist es fraglich, warum du eine Referenz zu einer Seite rausgeben musst. Da ich nicht weiß, wie die Methode benutzt wird (gibt keinen Aufruf hier in den snippets), kann ich aber nur spekulieren. Ich benutze bei Wizards gern enums, die alle Seiten mit sinnvollem Namen bezeichnet enthalten.
 
Zuerst mal die gute Nachricht: Hab den Fehler gefunden. Der Fehler war im Konstruktor des Wizards... dort hatte ich die Funktion addPages() aufgerufen. Das konntet ihr nicht sehen, da ich es nicht mitgeschickt habe. Dachte auch nicht, dass dort der Fehler liegt.

@Tumbleweed:
Den Next Button muss ich in diesem Fall auch nicht selbst implementieren, da mir das von SWT bzw. dem Wizard abgenommen wird. Ich muss dem Wizard nur sagen, dass die Seite vollständig ist. Dann kann der Nutzer auf weiter klicken und kommt zur nächsten Seite.

Die getNextPage Methode habe ich aus einem Tutorial im Internet von der Vogella-Webseite und ähnliche Tutorials haben die getNextPage Funktion auch so geschrieben. Deshalb habe ich mich daran gehalten. Diese Funktion wird wiederum auch vom Framework aufgerufen, sobald der Nutzer auf Weiter klickt (weshalb ich sie nicht selbst explizit aufrufen muss).

Da du dich offenbar auch nicht so gut mit dem Wizard und der dahinterstehenden Implementierung auskennst, verlinke ich hier mal ein Tutorial mit Beispielcode dazu: Link (Vogella)
 
Alles klar, dachte das Interface wäre aus deiner Feder. Dagegen kannst du natürlich dann nichts machen. Schön, dass du den Fehler allein gefunden hast.
 
Zurück
Oben