2012-04-14 61 views
38

我有一個JavaFX 2表格顯示人員的聯繫信息,可以想象有三列:名字,姓氏和電子郵件地址。當我的應用程序啓動時,它會在表中填入幾行關於系統中已有人員的數據。JavaFX 2自動列寬

問題是,列的寬度都是一樣的。大多數情況下,姓和名都顯示完整,但電子郵件地址已被剪輯。用戶可以雙擊標題中的分隔符來調整列的大小,但這會很快變得乏味。

一旦表已被預先填充,我想以編程方式調整所有列的大小以顯示它們包含的數據,但我無法弄清楚如何實現這一點。我可以看到,我可以撥打col.setPrefWidth(x)但這並沒有什麼幫助,因爲我不得不猜測寬度。

回答

56

如果您的總列數是預先知道的。您可以在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 

在這段代碼中,列的寬度比例保持同步時的tableview被調整,所以你不需要做手工。另外surnameCol佔用桌面視圖寬度的一半空間。

42

除了Uluk答案,使用widthProperty().multiply(x)而不是widthProperty().divide(x)看起來更加方便和準確。

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

可能更具可讀性,但沒有更準確的:它做的完全一樣的東西... – assylias 2013-10-07 11:43:58

9

這對我的作品在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 

在你有問題的其他例子,垂直滾動條的寬度被忽略。

+0

你在哪裏看到你可以將百分數傳遞給setMaxWidth? – 2016-02-18 13:34:51

+0

聰明的技巧 - 足夠大的數字,以便按比例調整大小以適應實際大小。 – Suma 2016-03-30 22:55:33

2

,因爲我用SceneBuider,我只是定義了MinWidth和MaxWidth一些列和主塔我只定義其中prefWidth爲「USE_COMPUTED_SIZE」

+1

這個編程版本只是'col.setPrefWidth(Control.USE_COMPUTED_SIZE);' – 2016-03-24 08:37:02

0

你也可以做到這一點通過編輯,如果你的FXML文件有一個。

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

參數prefWidth允許您修改列的默認值。

3

3年後,終於被我找到了解決辦法,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

我無法找到或導入類TableViewSkin。我正在使用Java 8,這個類似乎不存在。 – Spen 2018-01-07 17:36:49

1

如果你有4列,只擴大到填滿表格的寬度的其餘部分,其它列所需的最後一欄仍是大小我在Scene Builder中設置。

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

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

或者如果您有2列需要擴展然後。

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

要generelize寬度和使用任意數量,並確保寬度是表格的寬度爲100%,則可以使用:

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