2013-07-17 13 views
11

L'idea è: su un TableView di N colonne per avere sempre visibili le prime colonne M anche quando si utilizza lo scroller orizzontale.JavaFX, come bloccare la posizione di alcune colonne in TableView

L'unica cosa vicino al mio requisito è questo Binding two tableviews together such that they scroll in sync. L'idea di mettere fianco a fianco due tabelle non è il migliore dal mio punto di vista, perché

1) Il tipo di colonna è parzialmente indipendente tra le due tabelle: se si utilizza lo stesso observableList le file sono ordinati in entrambe le tabelle, ma non è possibile l'ordinamento su più colonne in cui almeno una colonna non è sulla stessa tabella
2) non c'è scorrimento sincrono con la rotella del mouse oi tasti frecce

so che, probabilmente , Posso affrontare problemi come questi usando EventHandlers e Listeners ma spero che sia possibile usare solo una tabella.

Quindi, la domanda è: ci sono proprietà configurabili su TableView o TableColumns per avere il comportamento che sto cercando?

risposta

2

Quindi, la domanda è: ci sono delle proprietà configurabili su TableView o TableColumns per avere il comportamento che sto cercando?

non

A quanto pare, ma v'è una richiesta di funzionalità di questo comportamento sulla JavaFX Jira (è necessario registrarsi per vederlo):

https://javafx-jira.kenai.com/browse/RT-19454

vi consiglio di votare a favore. : ^)

3

Attualmente non esiste una funzione simile. In effetti, anche manipolare la barra di scorrimento e rispondere agli eventi della barra di scorrimento è problematico. Due opzioni mi viene in mente:

Opzione # 1 - Multiple Tabella

creare un nuovo layout che contiene i due tavoli e due barre di scorrimento, come nel frammento FXML di seguito:

<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
    <bottom> 
    <ScrollBar fx:id="hScroll" /> 
    </bottom> 
    <center> 
    <HBox fx:id="varTable" prefHeight="100.0" prefWidth="200.0"> 
     <children> 
     <TableView fx:id="fixedTable" prefHeight="200.0" prefWidth="200.0"> 
      <columns> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      </columns> 
     </TableView> 
     <TableView prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS"> 
      <columns> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      </columns> 
     </TableView> 
     </children> 
    </HBox> 
    </center> 
    <right> 
    <ScrollBar fx:id="vScroll" orientation="VERTICAL" /> 
    </right> 
</BorderPane> 

Nota la seconda tabella ha HBox.hgrow = set "SEMPRE".

scrivere una funzione per localizzare la barra di scorrimento in una TableView:

private static final ScrollBar getScrollBar(final TableView<?> tableView) { 
    for (final VirtualFlow virtualFlow: Nodes.filter(Nodes.descendents(tableView, 2), VirtualFlow.class)) { 
    for (final Node subNode: virtualFlow.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && ((ScrollBar)subNode).getOrientation() == Orientation.VERTICAL) { 
      return (ScrollBar)subNode; 
     } 
    } 
    } 

    return null; 

}

Usare questo per localizzare le due barre di scorrimento verticale e legare sue proprietà (come Min, Max, il valore ecc) alla tua barra di scorrimento verticale e quindi nascondi le barre di scorrimento originali. Sarà inoltre necessario impostare managed = false in modo che non occupino spazio nel layout.

Individuare e nascondere le barre di scorrimento orizzontale e associare le proprietà della barra di scorrimento orizzontale della tabella "mobile" alla propria barra di scorrimento orizzontale.

Stiamo utilizzando con successo questa tecnica per collegare due tabelle con una barra di scorrimento singola durante l'attesa di this Jira da correggere.

Opzione # 2 - Scrivi la tua TableViewSkin Scarica la fonte JavaFX per vedere cosa fanno con la pelle e quindi è possibile scrivere una skin personalizzata completa o scrivere una pelle che avvolge due pelli normali e implementare in un modo simile all'opzione n. 1 sopra

1

JavaFX non ha questa funzionalità. Controlla SpreadsheetView ControlsFX.

2

Sono in grado di bloccare le colonne nella vista tabella javafx. Dobbiamo creare la nostra classe di colonne per tabelle personalizzate, in cui avremo due metodi: setFixed e isFixed, che verranno utilizzati per rendere alcune colonne come fisse.

Oltre a questo è necessario creare il proprio

  1. TableViewskin

  2. TableHeaderRow - sostanzialmente in questa classe è necessario eseguire l'override del getRootHeader() metodo

  3. NestedTableColumnHeader - In questa classe di override layoutChildren() metodo e aggiungere un nuovo metodo per il layout del fixedColumns
  4. VirtualFlow
  5. TableView - ignorare createDefaultSkin(), aggiungere nuove booleanProperty showColumnHeader e uno ObservableArrayList per fixedTableColumn
  6. TableRow - Override createDefaultSkin()
  7. TableRowSkinBase - ignorare layoutChildren() metodo per gestire colonne fisse.
Problemi correlati