JavaFX scrollpane-带滚轮的水平平移
我可以在JavaFX中创建一个滚动窗格,该窗格只能水平滚动,如下所示: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); 但是,在这种情况下,鼠标滚轮仍然尝试垂直滚动,而不是水平滚动(除非我专门在水平滚动条上滚动) 如何设置滚动窗格以使鼠标滚轮
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),可能是内容宽度。这将使滚动量独立于内容宽度。谢谢,这就成功了-真的应该早点发现它!显然今天过得很慢……:)