Pregunta

Estoy usando un JTabbedPane para mantener cada paso del asistente que estoy creando.La navegación entre pasos se realiza mediante los botones Anterior/Siguiente o seleccionando una pestaña.Los botones disminuyen/incrementan el SelectedIndex de JTabbedPane.

Necesito validar cada paso antes de pasar al siguiente.Básicamente, tengo dificultades para determinar qué evento usar.El evento StateChange ocurre demasiado tarde.¿Qué evento necesito observar?

Otra irritación:cuando se ejecuta el asistente, parece guardar el estado del SelectedIndex de JTabbedPane (generalmente el valor del último paso), este valor luego se usa para configurar SelectedIndex la próxima vez que se ejecuta el asistente.La propiedad selectedIndex en el diseñador no ha cambiado.Además, llamar a setSelectedIndex() en el constructor de JPanel no parece tener ningún efecto en esto.¿Qué me estoy perdiendo?

¿Fue útil?

Solución

En lugar de JTabbedPane , considerar el uso de < a href = "http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html" rel = "nofollow noreferrer"> CardLayout . Este último le permite controlar la navegación de forma más rígida.

Otros consejos

Puede extiende JTabbedPane para anular el método setSelectedIndex y luego llamar super.setSelectedIndex (index); después de hacer su validación algo como:

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

En primer lugar, usted está utilizando una JTabbedPane, lo que indica que el usuario puede seleccionar las fichas en cualquier orden, para implementar un asistente, que por lo general requiere pasos que hay que hacer en orden secuencial. Piense si este es el componente de interfaz de usuario de derecho de uso.

En segundo lugar, lo que estás buscando es un cambio de estado vetoable, a pesar de que no existe fuera de la caja.

He encontrado esto en un hilo en los foros de Sun :

El truco que he utilizado es reemplazar el SingleSelectionModel que es utilizado por el JTabbedPane. La extensión de la DefaultSingleSelectionModel y overiding el método setSelectedIndex parece hacer el trabajo fino (llamando al método súper sólo si el interruptor ha de ser permitido).

Además, Kirill Grouchnikov tiene algunas ideas aquí - " Spicing su JTabbedPane -. parte V"

Ocurre demasiado tarde porque se dispara cuando la pestaña ya ha cambiado, cuando lo que necesitas es saber cuándo está por cambiar.

Lo que podría intentar (si insiste en usar el panel con pestañas, que puede no ser la mejor opción) es agregar un detector de mouse y usarlo junto con un panel de vidrio.Eso capturará el evento del mouse y le permitirá realizar la validación.Si tiene éxito, cambie la pestaña mediante programación.

alt text

Tendrás que conectar los eventos, lo que hace que el código sea un poco difícil de escribir (supongo que por eso no ves pestañas en los asistentes)

En cuanto al índice, se debe a que estás usando la misma instancia.No tiene efecto porque hay que invocarlo en la instancia, no en el constructor.

Aquí hay una muestra de cómo usar Paneles de vidrio.

alt text

Vea cómo en el ejemplo interceptan el evento de clic en el botón.Podrías probar algo similar con la pestaña Tour.

Una alternativa de mala calidad (que es lo que voy a hacer, porque ya he hecho la mayoría de las y soy reacio a los cambios drásticos ahora) es establecer la propiedad enabled a falso. Los botones de ficha se desactivarán, pero los botones siguiente y anterior todavía se comportarán como se esperaba. Si los usuarios van a tolerar esto puede ser la solución fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top