javafx-2 tableview实现自定义列大小调整策略

javafx-2 tableview实现自定义列大小调整策略,java,tableview,javafx-2,Java,Tableview,Javafx 2,根据我的经验,如果TableView包含一些固定宽度的列,则受约束的_RESIZE_策略将被破坏,除非我在这里做错了什么: public class JavaFX2Sandbox extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage)

根据我的经验,如果TableView包含一些固定宽度的列,则受约束的_RESIZE_策略将被破坏,除非我在这里做错了什么:

public class JavaFX2Sandbox extends Application
{
    public static void main(String[] args)
    {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception
    {
        StackPane root = new StackPane();
        root.autosize();
        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();

        configureTable(root);
    }

    public static class Person
    {
        public Person(String firstName, String lastName)
        {
            this.fixedValue = "Dr.";
            this.firstName = firstName;
            this.lastName = lastName;
        }
        public String fixedValue;
        public String firstName;
        public String  lastName;
    }

    private static class CellValueFactory<T> implements Callback<TableColumn.CellDataFeatures<T, Object>, ObservableValue<Object>>
    {
        private String mFieldName;

        public CellValueFactory(String fieldName)
        {
            mFieldName = fieldName;
        }

        @Override
        public ObservableValue call(TableColumn.CellDataFeatures<T, Object> p)
        {
            try
            {
                if (p == null)
                {
                    return new SimpleObjectProperty(null);
                }
                Object o = p.getValue();
                if (o == null)
                {
                    return new SimpleObjectProperty(null);
                }
                Object fieldVal = o.getClass().getField(mFieldName).get(o);
                if (fieldVal == null)
                {
                    return new SimpleObjectProperty(null);
                }

                return new SimpleObjectProperty(fieldVal);
            }
            catch (Exception ex)
            {
                return new SimpleObjectProperty(ex);
            }
        }
    }
    private void configureTable(StackPane root)
    {

        TableView<Person> table = new TableView<>();
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        ArrayList<Person> teamMembers = new ArrayList<>();
        teamMembers.add(new Person("John", "Big"));
        teamMembers.add(new Person("Frank", "Small"));

        TableColumn col0 = new TableColumn("fixed-width");
        col0.setResizable(false);
        col0.setCellValueFactory(new CellValueFactory("fixedValue"));
        TableColumn col1 = new TableColumn("First Name");
        col1.setCellValueFactory(new CellValueFactory("firstName"));
        TableColumn col2 = new TableColumn("Last Name");
        col2.setCellValueFactory(new CellValueFactory("lastName"));
        table.getColumns().setAll(col0, col1, col2);
        table.setItems(FXCollections.observableList(teamMembers));

        root.getChildren().add(table);
    }
}
我假设表格宽度返回了包括边框在内的外部宽度,因此存在差异,但如何获得内部宽度?

请尝试下一步:

 double borderWidth = table.getBoundsInLocal().getWidth() - table.getWidth()

您是否尝试过获取占位符节点的宽度?

我也有同样的问题 而这
实现自定义列大小调整策略
是您的帮助。 谢谢你

你的密码

if (col.isResizable() && col.isVisible()) {
    double newWidth = (tvWidth - fixedColumnsWidths) / numColsToSize;
    col.setPrefWidth(newWidth);
    lastCol = col;
}
我换成

if (col.isResizable() && col.isVisible()) {
    double newWidth = (tvWidth - fixedColumnsWidths)*col.getPercentWidth();
    col.setPrefWidth(newWidth);
    lastCol = col;
}
带有
列的

public class PTableColumn<S, T> extends javafx.scene.control.TableColumn<S, T>
private DoubleProperty percentWidth = new SimpleDoubleProperty(1);

可能相关:谢谢你的想法。不幸的是,table.getBoundsInLocal()返回table.getWidth()-1(至少在我的例子中是这样),这意味着getBoundsInLocal()不是我要寻找的函数,因为在我的例子中,神奇的数字是2:-),根据您的定义,它确实有效。因为borderwidth=table.getBoundsInLocal().getWidth()-table.getWidth(),它是1,有两个边框,一个在左边,一个在右边,所以我需要将borderwidth乘以2,这样我就得到了我的神奇数字2。简单,但让我感觉不舒服,我希望API能以更直接的方式公开这个宽度。谢谢你的回答,不幸的是getPlaceholder()返回null。
public class PTableColumn<S, T> extends javafx.scene.control.TableColumn<S, T>
private DoubleProperty percentWidth = new SimpleDoubleProperty(1);