首页 > 解决方案 > JavaFx 修复表行

问题描述

我没有找到修复 tableView/treeTableView 中的列的答案的问题。

我想对表中的行做同样的事情,但应用相同的想法我无法实现任何目标。

对于列,想法是将单元格的 X 位置固定为滚动。

所以我对行尝试了同样的事情,而是将它们的 Y 位置固定为垂直滚动,但似乎什么也没发生。

这是您可以检查的代码:

Controller.java

public class Controller implements Initializable {

    @FXML
    private TreeTableView<Model> table;
    @FXML
    private TreeTableColumn<Model, String> col;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        col.setCellValueFactory(data -> data.getValue().getValue().text);

        setup();
        table.skinProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                TreeTableRow<Model> firstRow = (TreeTableRow<Model>) table
                        .queryAccessibleAttribute(AccessibleAttribute.ROW_AT_INDEX, 0);
                ScrollBar scrollBar = (ScrollBar) table
                        .queryAccessibleAttribute(AccessibleAttribute.VERTICAL_SCROLLBAR);
                scrollBar.valueProperty().addListener((obs, oV, nV) -> {
                    firstRow.toFront();
                    System.out.println("norm: " + nV); // debug
                    double value = convert(nV.doubleValue(), 0, table.getHeight()) / 2;
                    System.out.println("non-norm: " + value); // debug
                    firstRow.setTranslateY(value);
                });
            }
        });

    }

    private void setup() {
        table.setShowRoot(false);
        table.setRoot(new TreeItem<>());

        Model r1 = new Model("A");
        Model r2 = new Model("B");

        Model r11 = new Model("A1");

        Model l1 = new Model("Ba");
        Model l2 = new Model("Bb");

        TreeItem<Model> ti = new TreeItem<>(r2);

        ti.getChildren().add(new TreeItem<>(l1));
        ti.getChildren().add(new TreeItem<>(l2));

        table.getRoot().getChildren().add(new TreeItem<>(r11));
        table.getRoot().getChildren().add(ti);
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
        table.getRoot().getChildren().add(new TreeItem<>(r1));
    }

    private double convert(double val, double min, double max) {
        return val * (max - min) + min;
    }

    public static class Model {

        private StringProperty text;

        public Model(String text) {
            this.text = new SimpleStringProperty(text);
        }

        public StringProperty textProperty() {
            return text;
        }
    }

}

View.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns="http://javafx.com/javafx"
           xmlns:fx="http://javafx.com/fxml"
           fx:controller="stackoverflow.fixrow.Controller">

    <TreeTableView fx:id="table">
        <columns>
            <TreeTableColumn fx:id="col" prefWidth="200"/>
        </columns>
    </TreeTableView>
</StackPane>

经过一段时间的调试,我发现垂直滚动的值与水平滚动的值不同。垂直滚动具有标准化值,所以我认为这是我试图使用标准化值的问题,这就是它不起作用的原因,但是在将其转换回实际值之后似乎发生了同样的事情,所以什么也没有。

知道我错过了什么,或者为什么不像在专栏中那样工作?

当然,我将不胜感激任何其他可行的解决方案。

注意:这里我有一个TreeTableView,因为目前我需要它,但我认为相同的解决方案可以应用于TV两者TTV

标签: javajavafxjavafx-8treetableview

解决方案


推荐阅读