JavaFX scrollpane - 带滚轮的水平平移
JavaFX scrollpane - horizontal panning with scroll wheel
我可以在 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);
}
}
我也一直在寻找解决方案,并从 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
是 scrollPane
的内容(在我的例子中是一个 HBox)。通过将 delta y 值除以它的内容宽度,滚动速度自然根据要滚动的内容量而定。
我可以在 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);
}
}
我也一直在寻找解决方案,并从 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
是 scrollPane
的内容(在我的例子中是一个 HBox)。通过将 delta y 值除以它的内容宽度,滚动速度自然根据要滚动的内容量而定。