我有一个包含16个项目的ListView。当我滚动(使用箭头或鼠标)默认ListView ScrollBar时,它滚动一半项目。
我需要滚动一个项目(单击箭头或用鼠标滚动时),以便列表永远不会显示一半的项目。有什么办法吗? 这是我的代码:
public void start(Stage primaryStage) throws IOException {
ListView<String> lstRequestOpt = new ListView<>();
List<String> x = new ArrayList<>();
for(int i = 0; i < 30; i++) {
x.add("item " + i);
}
ObservableList<String> items = FXCollections.observableArrayList(x);
lstRequestOpt.setItems(items);
Scene scene = new Scene(lstRequestOpt);
primaryStage.setScene(scene);
primaryStage.show();
}
这是输出图像: ListView with half items
我要在这里实现的是,元素显示完整,而不像下面的图片所示:
有什么办法吗?
更新:
我可以设法创建一个方法,该方法将在每次使用滚动条或箭头时打印一些内容,即使它是最小的滚动条也是如此。现在,我需要找到一种方法来设置滚动中的移动值并将其与ListView集成。我会继续努力。这是代码:
for (Node node : lstRequestOpt.lookupAll(".scroll-bar")) {
if (node instanceof ScrollBar) {
final ScrollBar bar = (ScrollBar) node;
bar.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> value, Number oldValue, Number newValue) {
if ((double) oldValue < (double) newValue) {
System.out.println("UP");
} else {
System.out.println("DOWN");
}
}
});
}
}
感谢所有帮助我的人。
答案 0 :(得分:1)
我的方法很怪异。不确定这是否适合您。但是最后的意图是不要逐像素滚动。
这个想法是侦听垂直滚动条的value属性,并基于当前滚动条值设置ListView滚动。以下方法可以为您提供一些输入。缺点之一是我需要依赖VirtualFlow。
L
答案 1 :(得分:0)
尝试一下:
ListView listView = new ListView();
listView.setItems(listConetnt);
EventHandler onePositionScrollEvent = (EventHandler<ScrollEvent>) event -> {
int scrollIndex = 0;
if (event.getDeltaY() > 0) {
scrollIndex = listView.getSelectionModel().getSelectedIndex() - 1;
} else {
scrollIndex = listView.getSelectionModel().getSelectedIndex() + 1;
}
listView.getSelectionModel().select(scrollIndex);
};
listView.setOnScroll(onePositionScrollEvent);