2012-05-15 83 views
6

JavaFX2 TableView características "Reordenación de columna por el usuario en tiempo de ejecución". Me gustaría desactivar esta función para una tabla específica en mi aplicación.¿Cómo deshabilitar el reordenamiento de columnas en JavaFX2 TableView?

En cuanto al documento API, no hay un gancho de API obvio para esto. Sin embargo, existe columns -propiedad. De acuerdo con el documento, representa

TableColumns que forman parte de este TableView. A medida que el usuario reordena las columnas TableView, esta lista se actualizará para reflejar el orden visual actual.

Con la esperanza de que al menos podría restablecer un cambio después de que ocurriera, intenté agregar un oyente para restablecer los cambios después del hecho.

import javafx.application.Application; 
import javafx.collections.ListChangeListener; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableTest extends Application { 

    public static void main(String[] args) { 
    launch(args); 
    } 


    @Override 
    public void start(Stage stage) { 
    TableView tableView = new TableView(); 
    tableView.getColumns().setAll(new TableColumn(), new TableColumn()); 
    tableView.getColumns().addListener(new ListChangeListener() { 
     @Override 
     public void onChanged(Change change) { 
      if (change.wasPermutated()){ 
       change.reset(); 
      } 
     } 
    }); 
    stage.setScene(new Scene(tableView)); 
    stage.show(); 
    } 
} 

Sin embargo, el oyente aborta con un IllegalStateException cuando pido wasPermutated.
¿Hay alguna manera de evitar el reordenamiento, o al menos revertirlo programáticamente?

+0

Acabo de probar ese método y se llama al método 'onChanged' al mover las columnas. Sin embargo, recibo una IllegalStateException en 'change.wasPermutated()'. – assylias

+0

En ese caso, mi código probablemente era demasiado complejo. Crearé un ejemplo mínimo y continuaré desde allí. –

+1

Acabo de editar mi respuesta y funciona. Primero debe llamar a 'change.next()' antes de comprobar su estado + mover las columnas parece configurar el indicador para agregarse, no permutarse ... – assylias

Respuesta

8

Vea a continuación un SSCCE que muestra que se llama al oyente, pero el indicador se establece en added al mover columnas. Tenga en cuenta que debe llamar al next() antes de usar el cambio o obtendrá un IllegalStateException. Vea el javadoc of ListChangeListener.Change para un ejemplo canónico simple.

import javafx.application.Application; 
import javafx.collections.ListChangeListener; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableTest extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
    final TableView tableView = new TableView(); 
    final TableColumn[] columns = {new TableColumn("1"), new TableColumn("2")}; 
    tableView.getColumns().setAll(columns); 
    tableView.getColumns().addListener(new ListChangeListener() { 
     public boolean suspended; 

     @Override 
     public void onChanged(Change change) { 
      change.next(); 
      if (change.wasReplaced() && !suspended) { 
       this.suspended = true; 
       tableView.getColumns().setAll(columns); 
       this.suspended = false; 
      } 
     } 
    }); 
    stage.setScene(new Scene(tableView)); 
    stage.show(); 
    } 
} 
+0

Gracias a sus comentarios, ahora tengo una muestra de trabajo. Mi código es más conciso que el suyo y creo que es mejor que responda la pregunta, pero me gustaría atribuirle la solución. ¿Está bien si edito tu respuesta para mostrar mi código y marcarlo como aceptado? –

+0

@UrsReupke Claro, mi respuesta es solo parcial: debe publicar su respuesta y aceptarla si hace lo que usted quería. – assylias

+0

Puede editar el mío o crear uno nuevo: su llamada. – assylias

Cuestiones relacionadas