JavaFX 2自动列宽

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

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

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

如果你的总列数是预先知道的。 您可以在列表视图的宽度中分配列宽:

 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被resize时,列的宽度比例保持同步,所以你不需要手动去做。 此外, surnameCol占用surnameCol宽度的一半空间。

除了widthProperty().multiply(x)答案,使用widthProperty().multiply(x)而不是widthProperty().divide(x)看起来更加方便和准确。

 nameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25)); surnameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.50)); emailCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25)); 

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

在其他例子中,你有问题,垂直滚动条宽度被忽略。

3年后,终于find了解决办法, 在tableview中自动适合size的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(); } } } }); } } 

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

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

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

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

如果你有4列,只有最后一列需要扩大,以填补其余的表宽度和其他列保持我在场景生成器中设置的大小。

 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)); 

为了使宽度一致并使用任何数字并确保宽度是表格宽度的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-------------^-------------^ }