JavaFX:缩放和滚动无法正常工作
JavaFX: Zoom and Scroll do not work properly
我有以下结构:
ScrollPane
Pane
A set of children as ImageView
下面的class是我得到的(后面会加上link,现在找不到)
public class ZoomController extends ScrollPane{
private int deltaCount = 0;
private final double DEFAULT_ZOOM = 1.0;
private DoubleProperty zoomMax = new SimpleDoubleProperty(10.0);
private DoubleProperty zoomMin = new SimpleDoubleProperty(0.1);
private DoubleProperty zoomDelta = new SimpleDoubleProperty(1.2);
private DoubleProperty zoom = new SimpleDoubleProperty(DEFAULT_ZOOM);
GroupController gc;
public ZoomController(Node content) {
super();
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
System.out.println("Zoom=" + zoom.doubleValue());
content.scaleXProperty().bind(zoom);
content.scaleYProperty().bind(zoom);
content.translateXProperty();
}
});
content.setOnScroll(new EventHandler<ScrollEvent>() {
public void handle(ScrollEvent event) {
if (event.getDeltaY() > 0) {
zoomIn();
} else {
zoomOut();
}
}
});
}
public void zoomIn() {
double zoomValue = DEFAULT_ZOOM * Math.pow(zoomDelta.get(), deltaCount + 1);
System.out.println("Zoooom " + zoomValue);
if (zoomValue > zoomMax.get()) {
setZoom(zoomMax.get());
return;
}
deltaCount++;
setZoom(zoomValue);
}
public void zoomOut() {
double zoomValue = DEFAULT_ZOOM * Math.pow(zoomDelta.get(), deltaCount - 1);
System.out.println("Zoooom " + zoomValue);
if (zoomValue < zoomMin.get()) {
setZoom(zoomMin.get());
return;
}
deltaCount--;
setZoom(zoomValue);
}
public void setZoom(double zoomValue) {
zoom.set(zoomValue);
}
}
和下面的线折痕对象:
zoomController = new ZoomController(pane);
当我放大时,有一个很奇怪的行为——当我放大时,两侧的滚动条没有出现。如何让这些条出现?
据我了解,放大会改变内部面板的大小,当它变得比滚动面板大时,滚动面板上必须出现侧边栏。
在 ScrollPane
的内容的大小计算中不考虑 scale
属性。要解决此问题,可以将内容包装在 Group
中。此外,实际设置内容 可能 有所帮助。顺便说一句,您不应该在侦听器内部建立绑定到该绑定源的绑定。创建一个绑定到 属性
content.scaleXProperty().bind(zoom);
content.scaleYProperty().bind(zoom);
或在侦听器中设置值:
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number newZoom) {
System.out.println("Zoom=" + newZoom.doubleValue());
content.setScaleX(newZoom.doubleValue());
content.setScaleY(newZoom.doubleValue());
}
});
public class ZoomController extends ScrollPane {
private int deltaCount = 0;
private final double DEFAULT_ZOOM = 1.0;
private DoubleProperty zoomMax = new SimpleDoubleProperty(10.0);
private DoubleProperty zoomMin = new SimpleDoubleProperty(0.1);
private DoubleProperty zoomDelta = new SimpleDoubleProperty(1.2);
private DoubleProperty zoom = new SimpleDoubleProperty(DEFAULT_ZOOM);
public ZoomController(Node content) {
super(new Group(content));
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number newZoom) {
System.out.println("Zoom=" + newZoom.doubleValue());
content.setScaleX(newZoom.doubleValue());
content.setScaleY(newZoom.doubleValue());
}
});
content.setOnScroll(new EventHandler<ScrollEvent>() {
public void handle(ScrollEvent event) {
if (event.getDeltaY() > 0) {
zoomIn();
} else {
zoomOut();
}
}
});
}
我有以下结构:
ScrollPane
Pane
A set of children as ImageView
下面的class是我得到的(后面会加上link,现在找不到)
public class ZoomController extends ScrollPane{
private int deltaCount = 0;
private final double DEFAULT_ZOOM = 1.0;
private DoubleProperty zoomMax = new SimpleDoubleProperty(10.0);
private DoubleProperty zoomMin = new SimpleDoubleProperty(0.1);
private DoubleProperty zoomDelta = new SimpleDoubleProperty(1.2);
private DoubleProperty zoom = new SimpleDoubleProperty(DEFAULT_ZOOM);
GroupController gc;
public ZoomController(Node content) {
super();
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
System.out.println("Zoom=" + zoom.doubleValue());
content.scaleXProperty().bind(zoom);
content.scaleYProperty().bind(zoom);
content.translateXProperty();
}
});
content.setOnScroll(new EventHandler<ScrollEvent>() {
public void handle(ScrollEvent event) {
if (event.getDeltaY() > 0) {
zoomIn();
} else {
zoomOut();
}
}
});
}
public void zoomIn() {
double zoomValue = DEFAULT_ZOOM * Math.pow(zoomDelta.get(), deltaCount + 1);
System.out.println("Zoooom " + zoomValue);
if (zoomValue > zoomMax.get()) {
setZoom(zoomMax.get());
return;
}
deltaCount++;
setZoom(zoomValue);
}
public void zoomOut() {
double zoomValue = DEFAULT_ZOOM * Math.pow(zoomDelta.get(), deltaCount - 1);
System.out.println("Zoooom " + zoomValue);
if (zoomValue < zoomMin.get()) {
setZoom(zoomMin.get());
return;
}
deltaCount--;
setZoom(zoomValue);
}
public void setZoom(double zoomValue) {
zoom.set(zoomValue);
}
}
和下面的线折痕对象:
zoomController = new ZoomController(pane);
当我放大时,有一个很奇怪的行为——当我放大时,两侧的滚动条没有出现。如何让这些条出现?
据我了解,放大会改变内部面板的大小,当它变得比滚动面板大时,滚动面板上必须出现侧边栏。
在 ScrollPane
的内容的大小计算中不考虑 scale
属性。要解决此问题,可以将内容包装在 Group
中。此外,实际设置内容 可能 有所帮助。顺便说一句,您不应该在侦听器内部建立绑定到该绑定源的绑定。创建一个绑定到 属性
content.scaleXProperty().bind(zoom);
content.scaleYProperty().bind(zoom);
或在侦听器中设置值:
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number newZoom) {
System.out.println("Zoom=" + newZoom.doubleValue());
content.setScaleX(newZoom.doubleValue());
content.setScaleY(newZoom.doubleValue());
}
});
public class ZoomController extends ScrollPane {
private int deltaCount = 0;
private final double DEFAULT_ZOOM = 1.0;
private DoubleProperty zoomMax = new SimpleDoubleProperty(10.0);
private DoubleProperty zoomMin = new SimpleDoubleProperty(0.1);
private DoubleProperty zoomDelta = new SimpleDoubleProperty(1.2);
private DoubleProperty zoom = new SimpleDoubleProperty(DEFAULT_ZOOM);
public ZoomController(Node content) {
super(new Group(content));
zoom.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number newZoom) {
System.out.println("Zoom=" + newZoom.doubleValue());
content.setScaleX(newZoom.doubleValue());
content.setScaleY(newZoom.doubleValue());
}
});
content.setOnScroll(new EventHandler<ScrollEvent>() {
public void handle(ScrollEvent event) {
if (event.getDeltaY() > 0) {
zoomIn();
} else {
zoomOut();
}
}
});
}