JavaFX scrollpane-带滚轮的水平平移

JavaFX scrollpane-带滚轮的水平平移,java,javafx,javafx-8,scrollpane,Java,Javafx,Javafx 8,Scrollpane,我可以在JavaFX中创建一个滚动窗格,该窗格只能水平滚动,如下所示: ScrollPane scroll = new ScrollPane(lcp); scroll.setPannable(true); scroll.setFitToHeight(true); scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); 但是,在这种情况下,鼠标滚轮仍然尝试垂直滚动,而不是水平滚动(除非我专门在水平滚动条上滚动) 如何设置滚动窗格以使鼠标滚轮

我可以在JavaFX中创建一个滚动窗格,该窗格只能水平滚动,如下所示:

ScrollPane scroll = new ScrollPane(lcp);
scroll.setPannable(true);
scroll.setFitToHeight(true);
scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
但是,在这种情况下,鼠标滚轮仍然尝试垂直滚动,而不是水平滚动(除非我专门在水平滚动条上滚动)


如何设置滚动窗格以使鼠标滚轮水平平移?

以下是我为您编写的示例应用程序,它完全满足您的需要:

public class Test extends Application {

    ScrollPane scrollPane;
    int pos = 0;
    final int minPos = 0;
    final int maxPos = 100;

    @Override
    public void start(Stage primaryStage) {

        Label label = new Label("TEXT!!!!!!!TEXT!!!!!!!TEXT!!!!!!!TEXT!!!!!!!TEXT!!!!!!!TEXT");
        label.setPrefSize(500, 100);
        label.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent event) {

                if (event.getDeltaY() > 0)
                    scrollPane.setHvalue(pos == minPos ? minPos : pos--);
                else
                    scrollPane.setHvalue(pos == maxPos ? maxPos : pos++);

            }
        });

        scrollPane = new ScrollPane();
        scrollPane.setHmin(minPos);
        scrollPane.setHmax(maxPos);
        scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
        scrollPane.setHbarPolicy(ScrollBarPolicy.ALWAYS);
        scrollPane.setPannable(true);
        scrollPane.setFitToHeight(true);
        scrollPane.setContent(label);

        BorderPane root = new BorderPane();
        root.setPrefSize(200, 100);
        root.setCenter(scrollPane);

        primaryStage.setScene(new Scene(root));
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}
公共类测试扩展应用程序{
滚动窗格滚动窗格;
int pos=0;
最终int minPos=0;
最终int maxPos=100;
@凌驾
公共无效开始(阶段primaryStage){
标签标签=新标签(“文本!!!!!文本!!!!!文本!!!!!文本!!!!!文本!!!!!文本!!!!!!!!!文本!!!!!!!!!文本”);
标签尺寸(500100);
label.setOnScroll(新的EventHandler(){
@凌驾
公共无效句柄(ScrollEvent事件){
if(event.getDeltaY()>0)
scrollPane.setHvalue(pos==minPos?minPos:pos--);
其他的
scrollPane.setHvalue(pos==maxPos?maxPos:pos++);
}
});
scrollPane=新的scrollPane();
滚动窗格。设置最小值(minPos);
scrollPane.setHmax(maxPos);
scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setHbarPolicy(ScrollBarPolicy.ALWAYS);
scrollPane.setPannable(true);
scrollPane.setFitToHeight(true);
滚动窗格。设置内容(标签);
BorderPane根=新的BorderPane();
root.setPrefSize(200100);
root.setCenter(滚动窗格);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

我也一直在寻找解决方案,并从Ugurcan Yildirim找到了这个解决方案,但不喜欢自然滚动条长度和速度也被修改的事实。这一个对我有用:

scrollPane.setOnScroll(event -> {
    if(event.getDeltaX() == 0 && event.getDeltaY() != 0) {
        scrollPane.setHvalue(scrollPane.getHvalue() - event.getDeltaY() / this.allComments.getWidth());
    }
});
event.getDeltaX()==0
只是为了确保用户只使用鼠标滚轮,没有任何累加


this.allComments
滚动窗格
的内容(在我的例子中是HBox)。通过将增量y值除以其内容宽度,根据要滚动的内容量,滚动速度是自然的。

谢谢,
setOnScroll()
是我所需要的-但是,有没有办法使滚动窗格滚动恒定,而不考虑组件的宽度?随着scrollpane内容的宽度增加,只需添加/删除一个固定值,它就会按其宽度的百分比滚动,而不是(比如)每次滚动50个像素。每次scrollpane内容更改时,您都可以相应地设置“Hmax”值(maxPos),可能是内容宽度。这将使滚动量独立于内容宽度。谢谢,这就成功了-真的应该早点发现它!显然今天过得很慢……:)