我有一个显示人员联系方式的JavaFX 2表,让我们想象有三列:名字,姓氏和电子邮件地址。当我的应用程序启动时,它会在表格中填入几行有关系统中已有人员的数据。
问题是列宽都是一样的。大多数情况下,名字和姓氏都会完整显示,但电子邮件地址会被剪裁。用户可以双击标题中的分隔符来调整列的大小,但这将很快变得乏味。
一旦预先填充了表格,我想以编程方式调整所有列的大小以显示它们包含的数据,但我无法弄清楚如何实现这一点。我可以看到我可以调用col.setPrefWidth(x)
,但这并没有真正帮助,因为我必须猜测宽度。
答案 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,您可以了解其工作原理。
现在您可以调整列的大小,并添加以下行:
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));
}
});