Выберите первый элемент, отображаемый в treeTableView в JavaFX 8 - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть TreeTableView элемент управления с несколькими предметами. Пользователь может перемещаться с боковой полосой прокрутки к любой части таблицы. Как я могу узнать, какой элемент отображается в таблице первым? Я имею в виду первый пункт, который мы видим. Я просматривал методы, предлагаемые этим элементом управления, и видел, что scrollTo показывает элемент в соответствии с указанным нами номером заказа, но я не нашел ничего, похожего на getFirstItemShown. Я представляю, что для TableView управления он должен работать так же, верно? Я использую JavaFX 8.

1 Ответ

2 голосов
/ 07 февраля 2020

Просто для удовольствия:

(учтите, что при наличии линий разреза можно выбрать следующий ряд, а первый ряд иногда скрывается под столбцом)

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        primaryStage.setTitle("Tree View Sample");
        TreeItem<String> rootItem = new TreeItem<String> ("Inbox");
        rootItem.setExpanded(true);

        for (int i = 1; i < 888; i++) {
            TreeItem<String> item = new TreeItem<String> ("Message" + i);
            rootItem.getChildren().add(item);
        }
        TreeTableColumn<String, String> column = new TreeTableColumn<>("Column");
        column.setPrefWidth(150);
        column.setCellValueFactory((CellDataFeatures<String, String> p) -> new ReadOnlyStringWrapper(
                p.getValue().getValue()));
        TreeTableView<String> treeTableView = new TreeTableView<>(rootItem);
        treeTableView.getColumns().add(column);
        primaryStage.setScene(new Scene(treeTableView, 300, 250));
        primaryStage.show();

        Platform.runLater(()->{
            ScrollBar verticalBar = (ScrollBar) treeTableView.lookup(".scroll-bar");
            verticalBar.valueProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    int currentRow = 0;
                    if(newValue.doubleValue()<1){
                        currentRow =(int)((newValue.doubleValue()*treeTableView.getExpandedItemCount())-(newValue.doubleValue()*verticalBar.getVisibleAmount())*treeTableView.getExpandedItemCount());
                    }else {
                        currentRow =(int)(treeTableView.getExpandedItemCount()-verticalBar.getVisibleAmount()*treeTableView.getExpandedItemCount());
                    }
                    System.out.println(currentRow);
                }
            });
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}
...