2012-09-20 12 views

risposta

1

Non penso che sia attualmente possibile. TableViewSkin eredita da VirtualContainerBase che ha un campo VirtualFlow. L'oggetto VirtualFlow ha due campi VirtualScrollBar, hbar e vbar, che è quello che stai cercando. Non riesco a vedere alcun modo di arrivarci comunque.

È interessante notare che vi è anche un campo contentWidth privato in TableView sebbene questo sia privato. Sono sicuro che il team JFX si sta dimostrando estremamente cauto nell'aprire troppe API che è comprensibile. Si potrebbe chiedere di ottenere il campo contentWidth aperto come proprietà int come richiesta di funzionalità sulla JJX JIRA o sulla mailing list openjfx-dev.

Una misura del gap di arresto sarebbe quella di associare l'elemento selezionato o la proprietà dell'indice del modello di selezione delle viste tabella.

+0

Grazie per l'input. Qual è l'usanza per accettare risposte negative? Non ho idea se sia davvero impossibile o no, e dimostrarlo è sicuramente impossibile. Aspetterò almeno altri sei giorni. –

5

Ho creato un trucco CSS per associare un Tableview a una barra di scorrimento esterna. Una barra di scorrimento controlla entrambe le visualizzazioni di tabella.

Una panoramica della mia idea:

  • Creare due tableviews
  • fare una barra di scorrimento verticale. Chiamiamolo myScrollbar in questo esempio
  • Impostare il min e max di myScrollbar a misura di min = 0, max = TableView.Items.size()
  • Quando il valore dei cambiamenti myScrollbar quindi chiamare scrollTo sia di Tableview (int) function
  • Disattiva la barra di scorrimento verticale nativa di tableview implementata con CSS.

Questo vi darà due tabelle, entrambe controllate da una barra di scorrimento esterna (myScrollbar).

ecco il codice per nascondere la barra di scorrimento di un Tableview usando i 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; 

} 

Poi abbiamo bisogno di impostare la modalità di scorrimento del Tableview utilizzando la barra di scorrimento.

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 soluzione sembra eccezionale.Scrivilo come post in modo che venga archiviato nello stack overflow e ti darò la taglia. –

+0

grazie..e grazie :) – privatejava

1

Il modo più semplice che ho trovato per risolvere il problema è quello di legare l'ValueProperty del visibile una delle barre di scorrimento nascoste.

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

Ora si deve chiamare l'associazione dal Application dopo viene mostrato il palco e le tabelle sono resi:

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

Ora le tabelle dovrebbero scorrere in modo sincrono con il mouse, tastiera o barra di scorrimento.

Divertiti, Olaf