Select 在 JavaFX 8 中显示在 treeTableView 中的第一项
Select first item shown into a treeTableView in JavaFX 8
我有一个包含多个项目的 TreeTableView
控件。用户可以用侧滚动条移动到table的任何部分。我怎么知道 table 显示的第一项是什么?我的意思是,我们看到的第一个项目。我一直在研究这个控件提供的方法,我看到 scrollTo
根据我们指定的订单号显示一个项目,但我没有找到任何类似 getFirstItemShown
的东西。我想对于 TableView
控件,它应该工作相同,对吗?我正在使用 JavaFX 8。
纯属娱乐:
(注意如果有切线可以选择下一行,第一行有时会隐藏在Column下面)
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);
}
}
我有一个包含多个项目的 TreeTableView
控件。用户可以用侧滚动条移动到table的任何部分。我怎么知道 table 显示的第一项是什么?我的意思是,我们看到的第一个项目。我一直在研究这个控件提供的方法,我看到 scrollTo
根据我们指定的订单号显示一个项目,但我没有找到任何类似 getFirstItemShown
的东西。我想对于 TableView
控件,它应该工作相同,对吗?我正在使用 JavaFX 8。
纯属娱乐:
(注意如果有切线可以选择下一行,第一行有时会隐藏在Column下面)
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);
}
}