JavaFX的ListView控件触摸事件上下滚动 [英] JavaFX ListView with touch events for scrolling up and down

查看:2399
本文介绍了JavaFX的ListView控件触摸事件上下滚动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现用手势可滚动的ListView,就像在手机和平​​板电脑,以及上下滚动列表我用手指。但是我现在的名单,只要我单击在清单上选择一个项目。我怎样才能做到这一点?在甲骨文教程我找不到任何的例子。

 私人ObservableList<文件>项= FXCollections.observableArrayList();
@FXML的ListView<文件>列表显示;{
    ...    listView.setItems(项目);
    。listView.getStylesheets()加(风格/ listview.css);
    listView.setStyle( - FX-背景插图:0;); //删除列表视图容器像素边框    listView.setCellFactory(新回拨<&的ListView lt;文件>中的ListCell<文件>>(){
        @覆盖
        公众的ListCell<文件>致电(ListView的<文件>的ListView){
            返回新DocumentArrayAdapter();
        }
    });    ...
}公共无效loadListView(列表<文件> LDOC){
    如果(!ldoc.isEmpty()){
        items.addAll(LDOC);
    }
}


解决方案

这是我做了什么

 公共类CustomListCell扩展的ListCell<文件> {私人双lastYposition = 0;公共CustomListCell(){    setOnMouse pressed(新的EventHandler<&的MouseEvent GT;(){
        @覆盖
        公共无效手柄(事件的MouseEvent){
            lastYposition = event.getSceneY();
        }
    });    setOnMouseDragged(新的EventHandler<&的MouseEvent GT;(){
        @覆盖
        公共无效手柄(事件的MouseEvent){
            双newYposition = event.getSceneY();
            双差异= newYposition - lastYposition;
            lastYposition = newYposition;
            CustomScrollEvent CSE =新CustomScrollEvent();
            cse.fireVerticalScroll((int)的差异,DocumentArrayAdapter.this,(事件目标)event.getSource());
        }
    });

 包myproject.utils;进口javafx.event.Event;
进口javafx.event.EventTarget;
进口javafx.scene.input.ScrollEvent;公共类CustomScrollEvent {公共无效fireVerticalScroll(INT DELTAY,对象源,事件目标目标){    表示ScrollEvent newScrollEvent = NULL;
    newScrollEvent = new表示ScrollEvent(源,
               目标,
               ScrollEvent.SCROLL,
               0,
               0,
               0,
               0,
               假,
               假,
               假,
               假,
               假,
               假,
               0,
               DELTAY,
               0,
               0,
               ScrollEvent.Horizo​​ntalTextScrollUnits.CHARACTERS,
               0,
               ScrollEvent.VerticalTextScrollUnits.NONE,
               DELTAY,
               0,
               空值);        Event.fireEvent(目标,newScrollEvent);
}
}

虽然我已经实现了听众在我自己的ListCell,我想这也将工作直接在ListView的实施听众,与listView.setOnMouse pressed和listView.setOnMouseDragged

I would like to implement a scrollable ListView with gestures, just like in mobiles and tablets, to scroll up and down my list with a finger. But my current list selects an item as soon as I click down on the list. How can I achieve this? I couldn't find any example at the Oracle tutorials.

private ObservableList<Document> items = FXCollections.observableArrayList();
@FXML ListView<Document> listView;

{
    ...

    listView.setItems(items);
    listView.getStylesheets().add("style/listview.css");
    listView.setStyle("-fx-background-insets: 0 ;"); // remove 1px border of listview container

    listView.setCellFactory(new Callback<ListView<Document>, ListCell<Document>>() {
        @Override
        public ListCell<Document> call(ListView<Document> listView) {
            return new DocumentArrayAdapter();
        }
    });  

    ...
}

public void loadListView(List<Document> ldoc){
    if (!ldoc.isEmpty()){
        items.addAll(ldoc);
    }
}

解决方案

This is what I've made

public class CustomListCell extends ListCell<Document>{

private double lastYposition = 0;

public CustomListCell(){

    setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            lastYposition = event.getSceneY();
        }
    });

    setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            double newYposition = event.getSceneY();
            double diff = newYposition - lastYposition;
            lastYposition = newYposition;
            CustomScrollEvent cse = new CustomScrollEvent();
            cse.fireVerticalScroll((int)diff, DocumentArrayAdapter.this, (EventTarget) event.getSource());
        }
    });  

and

package myproject.utils;

import javafx.event.Event;
import javafx.event.EventTarget;
import javafx.scene.input.ScrollEvent;

public class CustomScrollEvent {

public void fireVerticalScroll(int deltaY, Object source, EventTarget target){

    ScrollEvent newScrollEvent = null;
    newScrollEvent = new ScrollEvent(source,
               target,
               ScrollEvent.SCROLL,
               0,
               0,
               0,
               0,
               false,
               false,
               false,
               false,
               false,
               false,
               0,
               deltaY,
               0,
               0,
               ScrollEvent.HorizontalTextScrollUnits.CHARACTERS,
               0,
               ScrollEvent.VerticalTextScrollUnits.NONE,
               deltaY,
               0,
               null);

        Event.fireEvent(target, newScrollEvent);
}
}

Although I've implemented the listener in my own ListCell, I guess it would also work implementing the listeners directly at the ListView, with listView.setOnMousePressed and listView.setOnMouseDragged

这篇关于JavaFX的ListView控件触摸事件上下滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆