我想向下滚动到TableView
中的特定行。 TableView#scrollTo(int index)
将行放在视图顶部的指定索引上,但我希望指定的索引位于视图的底部。这是因为对于我来说,指定的行将始终是当前焦点行下面的行,我只想滚动所需数量以显示下一行。即:我想要通过使用向上和向下键更改行选择时获得的行为。这可能吗?这是一个MCVE:
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TestScrollToTable extends Application {
@Override
public void start(Stage stage) {
TableView<ObservableList<String>> table = new TableView<>();
table.getSelectionModel().setCellSelectionEnabled(true);
ObservableList<String> columns = FXCollections.observableArrayList();
for (int i = 0; i < 10; i++) {
columns.add("column " + i);
}
ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();
for (int rowIndex = 0; rowIndex < 100; rowIndex++) {
ObservableList<String> row = FXCollections.observableArrayList();
for (int colIndex = 0; colIndex < columns.size(); colIndex++) {
row.add("row" + rowIndex + "col" + colIndex);
}
data.add(row);
}
for (int colIndex = 0; colIndex < columns.size(); colIndex++) {
final int j = colIndex;
TableColumn<ObservableList<String>, String> col = new TableColumn<ObservableList<String>, String>(
columns.get(colIndex));
col.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().get(j)));
table.getColumns().add(col);
}
table.setItems(data);
Button scrollToButton = new Button("Focus next row");
scrollToButton.setOnAction(e -> {
if (table.getFocusModel().getFocusedItem() != null) {
int nextIndex = table.getFocusModel().getFocusedIndex()+1;
table.getFocusModel().focus(nextIndex);
table.scrollTo(nextIndex);
}
});
VBox root = new VBox();
root.getChildren().addAll(table, scrollToButton);
stage.setScene(new Scene(root));
stage.show();
}
public static void main(String[] args) {
launch();
}
}
答案 0 :(得分:0)
你可以使用这个功能
private void scrollToUpAndBottom(int indexToScroll, VirtualFlow vf) {//scroll to up
if (indexToScroll < vf.getFirstVisibleCell().getIndex()) {
TableView.this.scrollTo(indexToScroll);
} else if (indexToScroll > vf.getLastVisibleCell().getIndex()) {//scroll to down
int delta = vf.getLastVisibleCell().getIndex() - vf.getFirstVisibleCell().getIndex();
TableView.this.scrollTo(indexToScroll - delta + 2); // +2 is margin
}
}
从TableView获取virtualFlow,您可以使用具有受保护属性的TableViewSkin&#34; flow&#34;所以你必须创建自己的皮肤,使这个属性pulic
public VirtualFlow getVirtualFlow(){ return flow;}