Frage

Ich bin mit einem JTabbedPane jeden Schritt des Assistenten zu halten, die ich baue. Navigation zwischen den Schritten tut mit den Schaltflächen Zurück / Weiter oder durch eine Registerkarte auswählen. Die Tasten Dekrement / erhöht die JTabbedPane selectedIndex.

Ich brauche jeden Schritt zu validieren, bevor mit dem nächsten Schritt fortfahren. Im Grunde habe Ich Schwierigkeiten bei der Bestimmung, welches Ereignis zu verwenden. Das Statechange-Ereignis tritt zu spät. Welche Veranstaltung muss ich beachten?

Eine weitere Reizung: wenn der Assistent ausgeführt wird, scheint es, den Zustand des JTabbedPane selectedIndex zu speichern (in der Regel des letzten Schrittes Wert) wird dieser Wert dann verwendet, um die SelectedIndex das nächste Mal setzen der Assistent ausgeführt wird. Die Eigenschaft selectedIndex im Designer ändern nicht. Um darüber hinaus die SetSelectedIndex () aufrufen, in der contructor JPanel der scheint nicht einen Einfluss auf diese zu haben. Was bin ich?

War es hilfreich?

Lösung

Statt JTabbedPane , sollten Sie mit < a href = "http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html" rel = "nofollow noreferrer"> Cardlayout . Letztere können Sie die Navigation steuern mehr starr.

Andere Tipps

Sie können sie JTabbedPane die SetSelectedIndex Methode außer Kraft zu setzen und dann super.setSelectedIndex (Index) nennen; nach der Validierung so etwas wie tun:

public class ValidationTabbedPane extends JTabbedPane {
    private static final long serialVersionUID = 1L;

    public ValidationTabbedPane() {
        super();
      }

      @Override
      public void setSelectedIndex(int index) {
          if (index >= 0 && index < getTabCount()) {
              if(getSelectedIndex() == -1) {
                  super.setSelectedIndex(index);
              } else  {
                  Containers tab = tabs.get(getSelectedIndex());
                  boolean change = true;
                  if(tab.isDirty()) {
                      if(!MessageAlert.
                              yesNoMessage("You have unsaved changes. Do you want to change tab anyways? ", 
                                      mainTabbedPane)) {
                          change = false;
                      }
                  }
                  if(change) {
                      super.setSelectedIndex(index);
                  }
              }
          }           
      }
}

Zuerst sind Sie mit einem JTabbedPane, was darauf hindeutet, dass der Benutzer mit der Tabulatortaste in beliebiger Reihenfolge auswählen kann, um einen Assistenten zu implementieren, die Schritte erfordert in der Regel in der angegebenen Reihenfolge durchgeführt werden. Denken Sie darüber nach, ob dies die richtige UI-Komponente zu verwenden.

Zweitens, was Sie suchen ist eine vetoable Zustandsänderung, obwohl das nicht out-of-the-Box vorhanden ist.

Ich fand diese in einen Thread in Sun Foren :

Der Trick, den ich verwendet habe, ist die SingleSelectionModel zu ersetzen, die durch die JTabbedPane verwendet wird. Die Erweiterung des DefaultSingleSelectionModel und overiding die SetSelectedIndex Methode scheint die Arbeit in Ordnung (Aufruf der Super Methode nur, wenn der Schalter zugelassen werden soll) zu tun.

Auch hat Kirill Grouchnikov einige Gedanken hier - „ Würzen up your JTabbedPane -. Teil V

Es kommt zu spät, denn das ist ausgelöst, wenn die Reiter bereits geändert haben, wenn das, was Sie brauchen, ist zu wissen, wenn es im Begriff ist, zu ändern.

Was könnten Sie versuchen (wenn Sie das Registerteilfenster beharren verwendet, die nicht die beste Option sein können) ist ein Maus-Listener hinzufügen und es in Verbindung mit einer Glasscheibe verwenden. Das wird das Maus-Ereignis erfassen und ermöglicht es Ihnen, die Validierung durchzuführen. Wenn es Ihnen gelingt, programmatisch auf die Registerkarte ändern.

Hier finden Sie die Veranstaltungen verdrahten haben, die den Code ein bisschen schwierig zu schreiben macht (das ist, warum Sie in Assistenten sehen Tabs nicht glaube ich)

Wie für den Index, das ist, weil Sie die gleiche Instanz verwenden. Dabei spielt es keine Wirkung hat, weil Sie es auf der Instanz nicht im Konstruktor aufgerufen haben.

Hier ist ein Beispiel, wie GlassPanes .

Sehen Sie, wie in der Probe sie das Click-Ereignis auf die Schaltfläche abfangen. Sie könnten etwas ähnliches mit Tour Registerkarte versuchen.

Sleazy Alternative (das ist, was ich tun werde, weil ich bereits die meisten der und bin abgeneigt, drastische Veränderungen nun getan haben) ist es, die enabled Eigenschaft auf false gesetzt. Die Registerkarte Tasten werden deaktiviert, aber Ihre nächsten und vorherigen Schaltflächen noch wie erwartet verhalten. Wenn die Benutzer dies tolerieren werden es die einfache Lösung sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top