2012-09-20 24 views

Respuesta

1

No creo que esto sea posible actualmente. TableViewSkin hereda de VirtualContainerBase que tiene un campo VirtualFlow. El objeto VirtualFlow tiene dos campos VirtualScrollBar, hbar y vbar, que es lo que buscas. Sin embargo, no veo ninguna forma de llegar a eso.

Curiosamente, también hay un campo contentWidth privado en TableView aunque esto es privado. Estoy seguro de que el equipo de JFX está siendo extremadamente cauteloso para abrir demasiado de la API, lo que es comprensible. Puede solicitar que se abra el campo contentWidth como una propiedad int como una solicitud de función en la lista de correo de JFX JIRA o openjfx-dev.

Una medida de pausa sería vincular el elemento seleccionado o la propiedad de índice del modelo de selección de vistas de tabla.

+0

Gracias por tu colaboración. ¿Cuál es la costumbre de aceptar respuestas negativas? No tengo idea si realmente es imposible o no, y probarlo así es seguramente imposible. Esperará al menos seis días más. –

5

He hecho un hack CSS para vincular una Tableview con una barra de desplazamiento externa. Una barra de desplazamiento controla ambas tablas.

Una visión general de mi idea:

  • Cree dos tableviews
  • hacer uno barra de desplazamiento vertical. Digamos que es myScrollbar en este ejemplo
  • Ajuste el min y max de myScrollbar al tamaño de min = 0, max = TableView.Items.size()
  • Cuando el valor de cambios myScrollbar continuación, llamar scrollTo de tanto tableview (int) función
  • Deshabilitar la barra de desplazamiento vertical nativa de la tabla vista implementada con CSS.

Esto le dará dos tablas, ambas controladas por una barra de desplazamiento externa (myScrollbar).

Este es el código para ocultar la barra de desplazamiento de un tableview usando CSS:

/* The main scrollbar **track** CSS class */ 

.mytableview .scroll-bar:vertical .track{ 
     -fx-padding:0px; 
    -fx-background-color:transparent; 
    -fx-border-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-border-radius:2em; 

} 

/* The increment and decrement button CSS class of scrollbar */ 

.mytableview .scroll-bar:vertical .increment-button , 
.mytableview .scroll-bar:vertical .decrement-button { 

    -fx-background-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-padding:0 0 0 0; 
} 

.mytableview .scroll-bar:vertical .increment-arrow, 
.mytableview .scroll-bar:vertical .decrement-arrow 
{ 
    -fx-shape: " "; 
    -fx-padding:0;   
} 

/* The main scrollbar **thumb** CSS class which we drag every time (movable) */ 
.mytableview .scroll-bar:vertical .thumb { 
    -fx-background-color:transparent; 
    -fx-background-insets: 0, 0, 0; 
    -fx-background-radius: 2em; 
    -fx-padding:0px; 

} 

Entonces tenemos que establecer cómo desplazarse por la tableview mediante el uso de la barra de desplazamiento.

scroll.setMax(100); //make sure the max is equal to the size of the table row data. 
scroll.setMin(0); 
scroll.valueProperty().addListener(new ChangeListener(){ 

    @Override 
    public void changed(ObservableValue ov, Number t, Number t1) { 
     //Scroll your tableview according to the table row index 
     table1.scrollTo(t1.intValue()); 
     table2.scrollTo(t1.intValue()); 
    } 

}); 

http://blog.ngopal.com.np/2012/09/25/how-to-bind-vertical-scroll-in-multi-tableview/

+0

La solución se ve genial.Escríbelo como una publicación para que esté archivado en el desbordamiento de la pila y te daré la recompensa. –

+0

gracias ... y aplausos :) – privatejava

1

La manera más fácil que he encontrado para resolver el problema consiste en obligar a la valueProperty de lo visible una las barras de desplazamiento ocultos.

// Controller 
@FXML private TableView<MyBean> tableLeft; 
@FXML private TableView<MyBean> tableRight; 
@FXML private ScrollBar scrollBar; 


@SuppressWarnings("rawtypes") 
private void bindScrollBars(TableView<?> tableView1, TableView<?> tableView2, 
       ScrollBar scrollBar, Orientation orientation) { 

    // Get the scrollbar of first table 
    VirtualFlow vf = (VirtualFlow)tableView1.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar1 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar1 = (ScrollBar)subNode; 
     } 
    } 

    // Get the scrollbar of second table 
    vf = (VirtualFlow)tableView2.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar2 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar2 = (ScrollBar)subNode; 
     } 
    } 

    // Set min/max of visible scrollbar to min/max of a table scrollbar 
    scrollBar.setMin(scrollBar1.getMin()); 
    scrollBar.setMax(scrollBar1.getMax()); 

    // bind the hidden scrollbar valueProterty the visible scrollbar 
    scrollBar.valueProperty().bindBidirectional(scrollBar1.valueProperty()); 
    scrollBar.valueProperty().bindBidirectional(scrollBar2.valueProperty()); 
} 

/* 
* This method must be called in Application.start() after the stage is shown, 
* because the hidden scrollbars exist only when the tables are rendered 
*/ 
public void setScrollBarBinding() { 
    bindScrollBars(this.tableLeft, this.tableRight, this.scrollBar, Orientation.VERTICAL); 
} 

Ahora tiene que llamar a la unión de la aplicación después se muestra el escenario y las mesas sean impuestos:

// Application 
    private MyController controller; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      FXMLLoader fxmlLoader = new FXMLLoader(SalesApp.class.getResource("scene.fxml")); 
      BorderPane root = (BorderPane) fxmlLoader.load();; 
      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("app.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show();    
controller = (MyController) fxmlLoader.getController(); 
      controller.setScrollBarBinding(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Ahora las tablas deben desplazarse de forma sincrónica a través del ratón, tecla o barra de desplazamiento.

Diviértete, Olaf

Cuestiones relacionadas