2

JavaFXでは、特定のTableColumnの特定のセルのセルレンダラーインスタンスを取得する方法は?

Swing では、その列のTableCellRendererでgetTableCellRendererComponent()を呼び出し、それに行と列のインデックスを渡す方法があります。しかし、JavaFX は非常に異なっているようです。TableColumn API を検索して調べてみましたが、これを理解できないようです。多分私はgetCellFactory()で何かをしなければなりません。

私の目標は、列の各セル レンダラーの優先幅をクエリし、列に設定する幅を計算して、その列のすべてのセルの内容が完全に表示されるようにすることです。

ここで質問がありました - JavaFX 2 Automatic Column Width - 元のポスターの目標は私の目標と同じでした。しかし、そこにはまだ満足のいく答えがありません。

4

1 に答える 1

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);
}
于 2012-10-05T14:43:28.277 に答える