JavaFX 可平移的 GridPane
JavaFX pannable GridPane
对于我当前的项目,我需要一个可以缩放和平移的具有透明背景的大型均匀网格。我最初尝试使用 ScrollPane
及其 setPannable(true)
,但很快发现滚动窗格背景将保持不透明,即使您调用 setStyle("-fx-background-color: transparent")
或 setStyle("-fx-background: transparent")
。因此,在删除了这个简单的选项后,我需要让有问题的 GridPane 直接平移。
我已经尝试了好几种方法,包括尝试将鼠标位置绑定到 GridPane
的翻译 属性(根本没用),但我没能成功更有希望正常工作的替代方案:
GridPane gridView = new GridPane();
int x;
int y;
gridView.setOnDragEntered( (event) -> {
x = event.getX();
y = event.getY();
});
gridView.setOnDragDetected( (event) -> {
gridView.setTranslateX(X - event.getX());
gridView.setTranslateY(Y - event.getY());
});
但是,这只会使地图向上和向左跳动,而不是像预期的那样用鼠标缓慢平移。
设法解决了大部分问题。剩下的一个问题是 GridPane
平移时相当抖动,但目前处于可接受的水平。
int x = 0;
int y = 0;
gridView.setOnMouseDragged((event) -> {
if(x != 0){ //prevent from panning before values are initialized
gridView.setTranslateX( gridView.getTranslateX() + limit(event.getX() - x, 25));
gridView.setTranslateY( gridView.getTranslateY() + limit(event.getY() - y, 25));
}
x = (int)event.getX();
y = (int)event.getY();
});
其中Limit(double num, double limit)
方法将输入num限制在[-limit, limit]范围内。降低限制会降低抖动,但同时也会降低响应速度。
对于我当前的项目,我需要一个可以缩放和平移的具有透明背景的大型均匀网格。我最初尝试使用 ScrollPane
及其 setPannable(true)
,但很快发现滚动窗格背景将保持不透明,即使您调用 setStyle("-fx-background-color: transparent")
或 setStyle("-fx-background: transparent")
。因此,在删除了这个简单的选项后,我需要让有问题的 GridPane 直接平移。
我已经尝试了好几种方法,包括尝试将鼠标位置绑定到 GridPane
的翻译 属性(根本没用),但我没能成功更有希望正常工作的替代方案:
GridPane gridView = new GridPane();
int x;
int y;
gridView.setOnDragEntered( (event) -> {
x = event.getX();
y = event.getY();
});
gridView.setOnDragDetected( (event) -> {
gridView.setTranslateX(X - event.getX());
gridView.setTranslateY(Y - event.getY());
});
但是,这只会使地图向上和向左跳动,而不是像预期的那样用鼠标缓慢平移。
设法解决了大部分问题。剩下的一个问题是 GridPane
平移时相当抖动,但目前处于可接受的水平。
int x = 0;
int y = 0;
gridView.setOnMouseDragged((event) -> {
if(x != 0){ //prevent from panning before values are initialized
gridView.setTranslateX( gridView.getTranslateX() + limit(event.getX() - x, 25));
gridView.setTranslateY( gridView.getTranslateY() + limit(event.getY() - y, 25));
}
x = (int)event.getX();
y = (int)event.getY();
});
其中Limit(double num, double limit)
方法将输入num限制在[-limit, limit]范围内。降低限制会降低抖动,但同时也会降低响应速度。