2012-04-14 18 views
38

Ho una tabella JavaFX 2 che visualizza i dettagli di contatto per le persone, consente di immaginare ci sono tre colonne: nome, cognome e indirizzo e-mail. All'avvio dell'applicazione, popola la tabella con diverse righe di dati relative alle persone già presenti nel sistema.JavaFX 2 Larghezza automatica colonna

Il problema è che le larghezze delle colonne sono tutte uguali. Il più delle volte il nome e il cognome vengono visualizzati per intero ma l'indirizzo e-mail viene tagliato. L'utente può fare doppio clic sul separatore nell'intestazione per ridimensionare la colonna, ma ciò diventerà noioso rapidamente.

Una volta che la tabella è stata pre-compilata, desidero ridimensionare a livello di codice tutte le colonne per visualizzare i dati che contengono ma non riesco a capire come ottenere ciò. Vedo che posso chiamare lo col.setPrefWidth(x) ma questo non aiuta molto dato che dovrei indovinare la larghezza.

risposta

56

Se il numero totale di colonne è noto. È possibile distribuire la larghezza delle colonne tra la larghezza della Tableview:

nameCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4 
surnameCol.prefWidthProperty().bind(personTable.widthProperty().divide(2)); // w * 1/2 
emailCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4 

In questo codice, le proporzioni della larghezza delle colonne sono mantenute in sincronia quando il Tableview viene ridimensionata, quindi non c'è bisogno di farlo manualmente. Anche lo surnameCol occupa metà spazio della larghezza della vista tabella.

42

In aggiunta alla risposta Uluk, utilizzando widthProperty().multiply(x) invece widthProperty().divide(x) sembra più comoda e accurata per me.

nameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25)); 
surnameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.50)); 
emailCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25)); 
+15

forse più leggibile, ma non di più preciso: che sta facendo la la stessa cosa esatta ... – assylias

9

questo funziona per me in JavaFX 8

table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
col1.setMaxWidth(1f * Integer.MAX_VALUE * 50); // 50% width 
col2.setMaxWidth(1f * Integer.MAX_VALUE * 30); // 30% width 
col3.setMaxWidth(1f * Integer.MAX_VALUE * 20); // 20% width 

Negli altri esempi che avete il problema, la larghezza barra di scorrimento verticale viene ignorato.

+0

Dove vedi che puoi passare le percentuali a setMaxWidth? –

+0

Trucco intelligente: numeri abbastanza grandi per cui è necessario utilizzare il ridimensionamento proporzionale per adattarsi alla dimensione reale. – Suma

2

come io uso SceneBuider, ho appena definisco il MinWidth, e MaxWidth ad alcune colonne e alla colonna principale per cui ho appena definisco il PrefWidth a "USE_COMPUTED_SIZE"

+1

La versione programmatica di questo è solo 'col.setPrefWidth (Control.USE_COMPUTED_SIZE);' –

0

È anche possibile farlo modificando il file fxml se averne uno

<TableColumn fx:id="blackout_number_column" prefWidth="30.0" text="%number"> 

Il parametro prefWidth consente di modificare il valore predefinito con una colonna.

3

Dopo 3 anni, finalmente ho trovato la soluzione, javafx column in tableview auto fit size

import com.sun.javafx.scene.control.skin.TableViewSkin; 
import javafx.scene.control.Skin; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class GUIUtils { 
    private static Method columnToFitMethod; 

    static { 
     try { 
      columnToFitMethod = TableViewSkin.class.getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class); 
      columnToFitMethod.setAccessible(true); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void autoFitTable(TableView tableView) { 
     tableView.getItems().addListener(new ListChangeListener<Object>() { 
      @Override 
      public void onChanged(Change<?> c) { 
       for (Object column : tableView.getColumns()) { 
        try { 
         columnToFitMethod.invoke(tableView.getSkin(), column, -1); 
        } catch (IllegalAccessException | InvocationTargetException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
    } 
} 
+0

Non riesco a trovare o importare la classe TableViewSkin. Sto usando Java 8 e questa classe non sembra esistere. – Spen

1

Se trovassi 4 colonne e solo nell'ultima colonna necessaria per espandere per riempire il resto della larghezza della tabella e le altre colonne rimasero la dimensione I impostato in Scene Builder.

double width = col1.widthProperty().get(); 
width += col2.widthProperty().get(); 
width += col3.widthProperty().get(); 

col4.prefWidthProperty().bind(table.widthProperty().subtract(width)); 

Oppure se si desiderava espandere due colonne.

double width = col1.widthProperty().get(); 
width += col3.widthProperty().get(); 

col2.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2)); 
col4.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2)); 
0

Per generelize la larghezza e utilizzare qualsiasi numero e assicurarsi che la larghezza è 100% della larghezza della tabella, è possibile utilizzare:

double[] widths = {20, 30, 50, 20, 30, 70, 50};//define the width of the columns 

//calculate the sum of the width 
double sum = 0; 
for (double i : widths) { 
    sum += i; 
} 

//set the width to the columns 
for (int i = 0; i < widths.length; i++) { 
    table.getColumns().get(i).prefWidthProperty().bind(
      table.widthProperty().multiply(sizes[i]/sum)); 
    //---------The exact width-------------^-------------^ 
}