Digging through the javafx source, I found that the actual method called when the TableView column separator is clicked,
/* * FIXME: Naive implementation ahead * Attempts to resize column based on the pref width of all items contained * in this column. This can be potentially very expensive if the number of * rows is large. */ @Override protected void resizeColumnToFitContent(TableColumn<T, ?> tc, int maxRows) { if (!tc.isResizable()) return; // final TableColumn<T, ?> col = tc; List<?> items = itemsProperty().get(); if (items == null || items.isEmpty()) return; Callback cellFactory = tc.getCellFactory(); if (cellFactory == null) return; TableCell<T,?> cell = (TableCell<T, ?>) cellFactory.call(tc); 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 TableColumnBase cell.getProperties().put(TableCellSkin.DEFER_TO_PARENT_PREF_WIDTH, Boolean.TRUE); // 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.snappedLeftInset() + r.snappedRightInset(); } int rows = maxRows == -1 ? items.size() : Math.min(items.size(), maxRows); double maxWidth = 0; for (int row = 0; row < rows; row++) { cell.updateTableColumn(tc); cell.updateTableView(tableView); cell.updateIndex(row); if ((cell.getText() != null && !cell.getText().isEmpty()) || cell.getGraphic() != null) { getChildren().add(cell); cell.applyCss(); maxWidth = Math.max(maxWidth, cell.prefWidth(-1)); getChildren().remove(cell); } } // dispose of the cell to prevent it retaining listeners (see RT-31015) cell.updateIndex(-1); // RT-36855 - take into account the column header text / graphic widths. // Magic 10 is to allow for sort arrow to appear without text truncation. TableColumnHeader header = getTableHeaderRow().getColumnHeaderFor(tc); double headerTextWidth = Utils.computeTextWidth(header.label.getFont(), tc.getText(), -1); Node graphic = header.label.getGraphic(); double headerGraphicWidth = graphic == null ? 0 : graphic.prefWidth(-1) + header.label.getGraphicTextGap(); double headerWidth = headerTextWidth + headerGraphicWidth + 10 + header.snappedLeftInset() + header.snappedRightInset(); maxWidth = Math.max(maxWidth, headerWidth); // RT-23486 maxWidth += padding; if(tableView.getColumnResizePolicy() == TableView.CONSTRAINED_RESIZE_POLICY) { maxWidth = Math.max(maxWidth, tc.getWidth()); } tc.impl_setWidth(maxWidth); }
He is declared in
com.sun.javafx.scene.control.skin.TableViewSkinBase
method signature
protected abstract void resizeColumnToFitContent(TC tc, int maxRows)
Since it is protected, you cannot call it, for example. tableView.getSkin (), but you can always extend the TableViewSkin override only for the resizeColumnToFitContent parameter and make it public.
Tomasz
source share