2012-04-14 4 views
38

J'ai une table JavaFX 2 qui affiche les coordonnées des personnes, imaginons qu'il y a trois colonnes: prénom, nom et adresse e-mail. Lorsque mon application démarre, elle remplit la table avec plusieurs lignes de données sur les personnes déjà présentes dans le système.JavaFX 2 Largeur de colonne automatique

Le problème est que les largeurs de colonne sont toutes les mêmes. La plupart du temps, le prénom et le nom sont affichés en entier, mais l'adresse e-mail est tronquée. L'utilisateur peut double-cliquer sur le diviseur dans l'en-tête pour redimensionner la colonne mais cela deviendra fastidieux rapidement.

Une fois que la table a été pré-remplie, je voudrais redimensionner toutes les colonnes par programme pour afficher les données qu'elles contiennent mais je n'arrive pas à comprendre comment y parvenir. Je peux voir que je peux appeler col.setPrefWidth(x) mais cela n'aide pas vraiment car je devrais deviner la largeur.

Répondre

56

Si le nombre total de colonnes est pré-connu. Vous pouvez distribuer la largeur des colonnes entre la largeur de la 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 

Dans ce code, les proportions largeur des colonnes sont synchronisés lorsque le tableview est redimensionnée, de sorte que vous n'avez pas besoin de le faire manuellement. Le surnameCol prend également la moitié de la largeur de la tableview.

42

En plus de la réponse Uluk, en utilisant widthProperty().multiply(x) à la place widthProperty().divide(x) me semble plus pratique et précis.

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

peut-être plus facile à lire, mais pas plus précis: il est fait la exactement la même chose ... – assylias

9

Cela fonctionne pour moi dans 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 

Dans les autres exemples que vous avez le problème, la largeur de défilement verticale est ignorée.

+0

Où voyez-vous que vous pouvez passer des pourcentages à setMaxWidth? –

+0

Truc astucieux - assez grand nombre de sorte que le dimensionnement proportionnel doit être utilisé pour s'adapter à la taille réelle. – Suma

2

Comme je l'utilise SceneBuider, je définis juste le MinWidth et MaxWidth à des colonnes et à la colonne principale je définis juste le PrefWidth à « USE_COMPUTED_SIZE »

+1

La version programmatique de ceci est juste 'col.setPrefWidth (Control.USE_COMPUTED_SIZE);' –

0

Vous pouvez aussi le faire en éditant le fichier FXML si vous avoir un.

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

Le paramètre prefWidth vous permet de modifier la valeur par défaut avec une colonne.

3

Après 3 ans, enfin je trouve la solution, 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

Je ne peux pas trouver ou importer la classe TableViewSkin. J'utilise Java 8 et cette classe ne semble pas exister. – Spen

1

Si vous aviez 4 colonnes et que la dernière colonne nécessaire pour se dilater pour remplir le reste de la largeur de la table et les autres colonnes sont restés la taille I dans Scene Builder.

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

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

Ou si vous aviez 2 colonnes qui avaient besoin de se développer alors.

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

Pour generelize la largeur et utiliser un nombre et assurez-vous que la largeur est de 100% de la largeur de la table, vous pouvez utiliser:

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-------------^-------------^ 
}