JavaFX-ListView在滚动条中向下或向上单击时会一一滚动

时间:2019-03-19 20:44:52

标签: listview javafx

我有一个包含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");
                    }
                }
            });
        }
    }

感谢所有帮助我的人。

2 个答案:

答案 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);