Domanda

Io sto usando un JTabbedPane di tenere ogni passo della procedura guidata che sto costruendo. La navigazione tra passi sta facendo utilizzando i pulsanti Previous / Next oppure selezionando una scheda. I pulsanti aumentare / diminuire SelectedIndex del JTabbedPane.

Ho bisogno di validare ogni passaggio prima di procedere alla fase successiva. In sostanza, sto avendo difficoltà a determinare quale evento da utilizzare. L'evento si verifica StateChange troppo tardi. Quale evento devo osservare?

Un altro irritazioni: quando la procedura guidata viene eseguito, sembra per salvare lo stato del del JTabbedPane SelectedIndex (di solito il valore dell'ultimo passaggio), questo valore viene poi utilizzato per impostare il SelectedIndex la prossima volta che si esegue la procedura guidata. La proprietà selectedIndex nella finestra di progettazione non è cambiare. Inoltre, chiamando il setSelectedIndex () in contructor del JPanel non sembra avere un effetto su questo. Che cosa mi manca?

È stato utile?

Soluzione

Invece di JTabbedPane , considerare l'utilizzo di < a href = "http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html" rel = "nofollow noreferrer"> CardLayout . Quest'ultimo permette di controllare la navigazione più rigidamente.

Altri suggerimenti

È possibile estende JTabbedPane l'override del metodo setSelectedIndex e quindi chiamare super.setSelectedIndex (indice); dopo aver fatto il tuo convalida qualcosa di simile:

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);
                  }
              }
          }           
      }
}

In primo luogo, si sta utilizzando un JTabbedPane, che indica che l'utente può selezionare le schede in qualsiasi ordine, di attuare una procedura guidata, che in genere richiede passi da compiere in ordine sequenziale. Pensate se questa è la componente a destra dell'interfaccia utente da utilizzare.

In secondo luogo, quello che stai cercando è un cambiamento di stato vetoable, anche se questo non esiste out-of-the-box.

Ho trovato questo in un thread nel forum di Sun :

Il trucco che ho usato è quello di sostituire il SingleSelectionModel che viene utilizzato dal JTabbedPane. Estendere la DefaultSingleSelectionModel e overiding il metodo setSelectedIndex sembra fare il buon lavoro (chiamando il metodo super-solo se l'interruttore deve essere consentito).

Inoltre, Kirill Grouchnikov ha alcuni pensieri qui - " speziatura il vostro JTabbedPane -. parte V "

Si verifica troppo tardi perché questo è sparato quando la linguetta hanno già cambiato, quando ciò che è necessario è quello di sapere quando sta per cambiare.

Che cosa si potrebbe provare (se insistete utilizzando il riquadro a schede che non può essere l'opzione migliore) è quello di aggiungere un listener del mouse e utilizzarlo in combinazione con una lastra di vetro. Che catturerà l'evento del mouse e vi permetterà di eseguire la convalida. In caso di successo si cambia la scheda programatically.

alt text

Dovrai collegare gli eventi, il che rende il codice un po 'difficile da scrivere (è per questo che non vedi schede in maghi immagino)

Per quanto riguarda l'indice, è perché si sta utilizzando la stessa istanza. Non ha effetto perché si deve richiamare sul istanza non nel costruttore.

Ecco un esempio su come utilizzare GlassPanes .

alt text

Guarda come nel campione intercettano l'evento click sul pulsante. Si potrebbe provare qualcosa di simile con scheda tour.

Un'alternativa squallido (che è quello che ho intenzione di fare perché ho già fatto la maggior parte del e sono contrari a cambiamenti drastici ora) è quello di impostare la proprietà enabled su false. I pulsanti TAB saranno disabilitati, ma i pulsanti Avanti e Indietro saranno ancora funzionare come previsto. Se gli utenti potranno tollerare questo può essere la soluzione facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top