50

我有一个显示联系人详细信息的 JavaFX 2 表,假设有三列:名字、姓氏和电子邮件地址。当我的应用程序启动时,它会在表格中填充几行关于系统中已有人员的数据。

问题是列宽都是一样的。大多数情况下,名字和姓氏会完整显示,但电子邮件地址会被截断。用户可以双击标题中的分隔线来调整列的大小,但这很快就会变得乏味。

预先填充表格后,我想以编程方式调整所有列的大小以显示它们包含的数据,但我不知道如何实现这一点。我可以看到我可以打电话col.setPrefWidth(x),但这并没有真正帮助,因为我必须猜测宽度。

4

7 回答 7

81

如果您的总列数是已知的。您可以在 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占用了 tableview 宽度的一半空间。

于 2012-04-14T10:47:39.317 回答
23

这在 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

在您遇到问题的其他示例中,垂直滚动条宽度被忽略。

于 2016-02-08T08:42:08.880 回答
4

当我使用 SceneBuider 时,我只是将 MinWidth 和 MaxWidth 定义到某些列和主列,我只是将 PrefWidth 定义为“USE_COMPUTED_SIZE”

于 2016-02-18T11:38:29.843 回答
3

3年后,我终于找到了解决方案,tableview中的javafx列自动调整大小

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();
                    }
                }
            }
        });
    }
}
于 2016-07-31T17:07:16.380 回答
3

如果您有 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));
于 2016-08-12T12:37:47.103 回答
1

此外,一个非常简单的基于 an 的技巧AnchorPane将是一个很好的解决方案。

我们将把它包装TableView成一个AnchorPane,但我们也会像这样锚定左右两侧TableView

AnchorPane wrapper = new AnchorPane();

AnchorPane.setRightAnchor(table, 10.0);
AnchorPane.setLeftAnchor(table, 10.0);
wrapper.getChildren().add(table);

这个简单的代码也将TableView在两个方向(左右)拉伸,它会在添加滚动条时进行调整。

观看此动画 gif,您可以了解其工作原理。

在此处输入图像描述

现在您可以调整列的大小,添加以下行:

fnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width
lnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 40 ); // 40% width
emColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width
于 2018-07-13T09:23:31.330 回答
0

我的想法。

table.getColumns().add(new TableColumn<>("Num") {
    {
        // 15%
        prefWidthProperty().bind(table.widthProperty().multiply(0.15));
    }
});
table.getColumns().add(new TableColumn<>("Filename") {{
    // 20%
    prefWidthProperty().bind(table.widthProperty().multiply(.2));
}});
table.getColumns().add(new TableColumn<>("Path") {{
    // 50%
    prefWidthProperty().bind(table.widthProperty().multiply(.5));
}});
table.getColumns().add(new TableColumn<>("Status") {
    {
        // 15%
        prefWidthProperty().bind(table.widthProperty().multiply(.15));
    }
});
于 2020-08-12T16:00:10.030 回答