JFace Wizard: Rauskriegen wann der Next-Button geklickt wurde?

MartinMueller

Grünschnabel
Hallo,

weiß jemand wie man beim JFace-Wizard raus kriegen kann, wann der Next-Button geklickt wurde? Die getNextPage()-Methode in der WizardPage zu überschreiben reicht für mich leider nicht aus, da diese Methode ja auch aufgerufen wird, wenn der Wizard einfach nur "wissen will" ob es noch eine nächste Seite gibt und er somit den Next-Button aktivieren muss.
Ich muss jedoch eindeutig wissen, ob der Next-Button gedrückt wurde. Ich hab den Code von WizardDialog, Wizard usw schon ein bisschen durchstöbert. Wie es aussieht kann man sich nicht direkt als Listener ranhängen.
Kennt vielleicht jemand einen Trick, wie man trotzdem eindeutig mitbekommt, wenn der Next-Button geklickt wurde?

Danke schon mal und schöne Grüße
 
Ich weiß zwar nicht genau wie es bei den Next-buttons aussieht. Aber bei den Buttons OK und Cancel hat man doch, wenn ich mich recht entsinne, jeweils eine Funktion mit den Namen

Java:
public boolean performFinish() {
// ...
return false;
}

public boolean performCancel {
// ...
return false;
}

Diese werden aufgerufen, wenn der OK bzw. Cancel Button betätigt wurde.
Gibts sowas nicht auch für die Nextbuttons? Müsste es eigentlich.

Würde einfach in die performNext (wenn es sowas gibt) dann eine andere Methode aufrufen, in der Sie einfügen, was passieren soll, wenn ein jemand auf "Next" drückt.

Etwas anderes fällt mir momentan auch nicht ein.

Gruß,
Jens
 
Gibts sowas nicht auch für die Nextbuttons?

Nein, leider nicht. Es gibt nur die getNextPage()-Methode. Aber die wird (wie oben schon geschrieben) eben auch dann aufgerufen, wenn der Wizard einfach nur mal "gucken" will, obs überhaupt noch ne nächste Seite gibt.

Ich hab mir jetzt einfach nen eigenen Container erstellt, indem ich WizardDialog abgeleitet und die NextButtonPressed()-Methode überschrieben habe. Dazu hab ich mir nen Listener gebaut, den mein Container verwaltet, so dass sich die Controller der einzelnen WizardPages beim Container anmelden können, um dann beim Klicken des Next-Buttons benachrichtigt zu werden.

Alles ziemlich umständlich und entwurfs-technisch nicht grade schön. Aber der jface Wizard ist halt einfach nicht für komplizierte dynamische Wizards geeignet. Beim nächsten mal baue ich mir lieber ein eigenes Framework. Aber schlauer ist man ja leider immer erst hinterher ;)
 
Bei mir hat der Wizard noch nie mittels getNextPage() nachgesehen, ob überhaupt 'ne nächste Seite da ist. Deshalb hätte ich auch das Überschreiben selbiger Methode als Lösung für Dein Problem angeboten. Wenn er doch gucken würde, würde die Beschreibung der API ("Returns the wizard page that would to be shown if the user was to press the Next button.") auch nicht stimmen. Naja, wird Dir mittlerweile egal sein... ;)
 
@mschlegel: die Methode kann ich aber nur nutzen, wenn ich meine WizardPages von der Klasse WizardNewProjectCreationPage ableite. Und nur für diese eine Methode von der Klasse zu erben, finde ich noch unsauberer als mir einen eigenen Container zu erstellen.
Aber trotzdem danke für den Tipp. Wurde festgehalten, für den Fall, dass ich die Klasse mal für einen anderen Wizard gebrauchen könnte.

@ishino: dann hast du wohl nie die Methode setPageComplete() genutzt. Die ruft nämlich die Methode updateButtons() (aus der Klasse WizardDialog) auf, diese wiederum ruft canFlipToNextPage() auf, um zu schauen, ob der Next-Button aktiviert werden soll. Die canFlipToNextPage()-Methode ruft dann die getNextPage()-Methode auf, um zu schauen, ob es überhaupt eine nächste Seite gibt.
D.h. wenn der Nutzer alle benötigten Daten eingegeben hat und ich über die Methode setPageComplete(true), den Next-Button freigeben will, wird die getNextPage()-Methode aufgerufen und nicht erst wenn der Nutzer wirklich auf Next klickt.

Ich setze das Thema auf erledigt, da meine Lösung für mich funktioniert und es scheinbar (für meinen Fall) keine bessere Lösung zu geben scheint.
Trotzdem danke für die Bemühungen.
 
Falls jemand wieder auf dieses Problem stoßen sollte:

in der addPages() Methode des Wizard folgendes probieren:

Code:
    IWizardContainer wizardContainer = this.getContainer();
    if ( wizardContainer instanceof IPageChangeProvider )
    {
      IPageChangeProvider pageChangeProvider = (IPageChangeProvider) wizardContainer;
      pageChangeProvider.addPageChangedListener( new IPageChangedListener()
      {
        @Override
        public void pageChanged( PageChangedEvent event )
        {
            //update something on the pages
        }
      } );
    }
 

Neue Beiträge

Zurück