2012-10-03 63 views
2

在JavaFX中,如何獲取給定TableColumn的給定單元格的單元格渲染器實例?JavaFX:TableColumn的給定行的單元格渲染器實例

在Swing,做它的方式是調用getTableCellRendererComponent()的TableCellRenderer該列,並通過它的行和列索引。但JavaFX似乎非常不同。我試着搜索並通過TableColumn API,但我似乎無法弄清楚這一點。也許我必須做點什麼getCellFactory()

我的目標是查詢列的每個單元格渲染器的首選寬度,然後計算在該列上設置的寬度,以便該列的所有單元格的內容都完全可見。

這裏問了一個問題 - JavaFX 2 Automatic Column Width - 其中原始海報的目標與我的相同。但還沒有一個令人滿意的答案。

回答

0

TableColumnHeader類中有resizeToFit()方法。不幸的是它受到保護。如何只將代碼複製粘貼到您的應用程序,並改變了一點:

protected void resizeToFit(TableColumn col, int maxRows) { 
    List<?> items = tblView.getItems(); 
    if (items == null || items.isEmpty()) return; 

    Callback cellFactory = col.getCellFactory(); 
    if (cellFactory == null) return; 

    TableCell cell = (TableCell) cellFactory.call(col); 
    if (cell == null) return; 

    // set this property to tell the TableCell we want to know its actual 
    // preferred width, not the width of the associated TableColumn 
    cell.getProperties().put("deferToParentPrefWidth", Boolean.TRUE);//the change is here, only the first parameter, since the original constant is not accessible outside package 

    // determine cell padding 
    double padding = 10; 
    Node n = cell.getSkin() == null ? null : cell.getSkin().getNode(); 
    if (n instanceof Region) { 
     Region r = (Region) n; 
     padding = r.getInsets().getLeft() + r.getInsets().getRight(); 
    } 

    int rows = maxRows == -1 ? items.size() : Math.min(items.size(), maxRows); 
    double maxWidth = 0; 
    for (int row = 0; row < rows; row++) { 
     cell.updateTableColumn(col); 
     cell.updateTableView(tblView); 
     cell.updateIndex(row); 

     if ((cell.getText() != null && !cell.getText().isEmpty()) || cell.getGraphic() != null) { 
      getChildren().add(cell); 
      cell.impl_processCSS(false); 
      maxWidth = Math.max(maxWidth, cell.prefWidth(-1)); 
      getChildren().remove(cell); 
     } 
    } 

    col.impl_setWidth(maxWidth + padding); 
} 

然後就可以調用加載數據後的方法:

for (TableColumn clm : tblView.getColumns()) { 
    resizeToFit(clm, -1); 
}