JavaFX 2自动列宽

时间:2012-04-14 10:20:59

标签: javafx-2

我有一个显示人员联系方式的JavaFX 2表,让我们想象有三列:名字,姓氏和电子邮件地址。当我的应用程序启动时,它会在表格中填入几行有关系统中已有人员的数据。

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

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

9 个答案:

答案 0 :(得分:67)

如果您的总列数是预先知道的。您可以在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宽度的一半空间。

答案 1 :(得分:14)

这适用于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

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

答案 2 :(得分: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();
                    }
                }
            }
        });
    }
}

答案 3 :(得分:2)

当我使用SceneBuider时,我只是将MinWidth和MaxWidth定义为某些列,而主列我只是将PrefWidth定义为&#34; USE_COMPUTED_SIZE&#34;

答案 4 :(得分: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));

答案 5 :(得分:0)

如果您有fxml文件,也可以通过编辑fxml文件来完成。

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

参数prefWidth允许您修改列的默认值。

答案 6 :(得分:0)

要增加宽度并使用任何数字并确保宽度为表格宽度的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-------------^-------------^
}

答案 7 :(得分:0)

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

我们将TableView包裹到AnchorPane中,而且我们也将锚定TableView的左侧和右侧,如下所示:

AnchorPane wrapper = new AnchorPane();

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

此简单的代码还将在两个方向(左右)上拉伸TableView,只要添加滚动条,它就会进行调整。

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

enter image description here

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

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

答案 8 :(得分: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));
    }
});