2014-12-15 23 views
6

Sto programmando una semplice applicazione Questionare. Sto usando un TableView all'interno di un componente javaFX personalizzato (che rappresenta una domanda), che viene usato come ListCell all'interno di un ListView (utilizzato per rappresentare l'intero questionario).Come limitare la dimensione di TableView di javafx alla dimensione necessaria?

Cosa voglio: Ogni ListCell utilizza il minimo spazio possibile (o necessario) mentre continua a riprodurre il suo contenuto completo.

Cosa succede: il TableView sembra essere impostato su una dimensione standard. Se la tabella ha più contenuti, visualizza il suo contenuto all'interno di un ScrollPane. Se il TableView ha meno contenuto, si riempie di spazio vuoto.


ho provato a risolvere il mio problema in vari modi:

  1. Originariamente ho pensato che ci deve essere un modo disattivare le barre di scorrimento. Ma non sono riuscito a trovare alcun modo per farlo.

  2. Poi ho cercato di cambiare la dimensione del tavolo cambiando il PreferredSizeProperty: table.setPrefHeight() ma non riesco a trovare tutte le informazioni su quanto grande sia il tavolo è. table.setPrefHeight(USE_COMPUTED_SIZE); non ha avuto il risultato che speravo.

  3. Quindi ho provato a calcolare l'altezza necessaria da solo, ma non sono riuscito a trovare alcun modo per determinare l'altezza delle singole righe. Chiamando this.getTableRow().getHeight() all'interno del metodo di aggiornamento del TableCell personalizzato si otterrebbe NullPointerExceptions. Se controllato contro null, restituirebbe comunque 0! TableRow<T> tr = this.getTableRow(); if (tr != null) { System.out.println(tr.getHeight()); }

  4. Piuttosto frustrato, ho deciso di fissare l'altezza della riga, chiamando table.setFixedCellSize(20); Questa gravemente limita il punto di TableCells personalizzati, ma non stavo facendo alcun progresso altrimenti. Tuttavia, l'altezza della tabella non è uguale al numero di linee moltiplicato per un'altezza di riga fissa, poiché l'intestazione della tabella deve essere presa in considerazione. E non ho potuto accedere all'intestazione della tabella o chiedere le dimensioni/altezza delle intestazioni della tabella.

Avete qualche suggerimento dove ho sbagliato o che cosa ho trascurato per raggiungere il mio obiettivo originale (Avere un ListCell che è preciesly grande come un necessario per visualizzare ogni riga della tabella, ma non una sola linea vuota?) Qualsiasi aiuto/idee sarebbe il benvenuto! Grazie!

+0

Così lo avete riempito insieme: ListView -> ListCell -> TableView? Questo è sbagliato su così tanti livelli ... Non so da dove cominciare. Ti consiglio vivamente di riscrivere l'interfaccia utente con componenti diversi. ListView e TableView hanno entrambi lo scopo di visualizzare enormi quantità di dati e quindi di strutturare i propri figli (celle) in modo virtualizzato. Non ha lo scopo di visualizzare una singola domanda contenente un TableView come grafica ListCell. – eckig

+0

Una domanda viene repressa da un componente personalizzato che utilizza un TableView come sottocomponente. Ogni domanda è di per sé una ListCell, da visualizzare in una ListView. Il TableView non è grande nel mio caso: può contenere da 1 a 10 righe. Sono d'accordo: per una riga sembra un po 'inutile, ma se sono necessarie diverse linee, non vedo ancora cosa c'è di sbagliato in essa. – thorwinn

+0

Quello che stai cercando di fare sarà molto difficile (se è anche possibile). Un 'TableView' non dovrebbe essere usato per il layout, che è effettivamente quello che stai cercando di fare qui. Hai effettivamente bisogno di una funzionalità di una vista tabella (colonne ridimensionabili, colonne trascinabili, ordinamento su clic dell'intestazione, ecc.)? Altrimenti potrebbe essere meglio usare un riquadro di layout (ad esempio un 'GridPane') per visualizzare la cella invece di un' TableView'. –

risposta

0

Date un'occhiata a:

tableView.setColumnResizePolicy(..); 

Forse questo può aiutare a

1

con l'uso di Associazioni (esempio ha una vista tavolo con un minimo di 2 file, o una tabella delle dimensioni di tutto elementi nell'elenco ...

/** 
* Helper to set table height based on content 
* 
* @param table  - the table in context 
* @param rowHeight - the height of a single row, alternatively could use table.fixedCellSizeProperty() 
* @param headerHeight - the height of the table header 
* @param margin  - a value for the margins 
*/ 
public void tableHeightHelper(TableView<?> table, int rowHeight, int headerHeight, int margin) { 
    table.prefHeightProperty().bind(Bindings.max(2, Bindings.size(table.getItems())) 
              .multiply(rowHeight) 
              .add(headerHeight) 
              .add(margin)); 
    table.minHeightProperty().bind(table.prefHeightProperty()); 
    table.maxHeightProperty().bind(table.prefHeightProperty()); 
} 

con un ascoltatore o di sottoscrizione della lista che alimenta il tavolo la dimensione della tabella sarà sempre adattarsi alle voci

Dipende davvero da come si personalizzano le celle per la visualizzazione elenco e da come è stata configurata la cella di produzione ...Finché fixedCellProperty() in ListView non è impostato, non ho avuto un problema con le singole celle in un ListView che si adattano alle dimensioni dei nodi che contengono.

+0

Quando si chiama questa funzione accade e perché? – npskirk