3 回答
TA贡献1858条经验 获得超8个赞
如果zoomPane中原始内容的大小已经大于View Port,那么来自jewelsea的答案就有一个问题。然后,以下代码将不起作用。zoomPane.setMinSize(newValue.getWidth(),newValue.getHeight());
结果是当我们缩小时,内容不再居中。
若要解决此问题,您需要在zoomPane和ScrollPane之间创建另一个StackPane。
// Create a zoom pane for zoom in/out
final StackPane zoomPane = new StackPane();
zoomPane.getChildren().add(group);
final Group zoomContent = new Group(zoomPane);
// Create a pane for holding the content, when the content is smaller than the view port,
// it will stay the view port size, make sure the content is centered
final StackPane canvasPane = new StackPane();
canvasPane.getChildren().add(zoomContent);
final Group scrollContent = new Group(canvasPane);
// Scroll pane for scrolling
scroller = new ScrollPane();
scroller.setContent(scrollContent);
然后在viewportBoundsProperty侦听器中,将zoomPane更改为canvasPane
// Set the minimum canvas size
canvasPane.setMinSize(newValue.getWidth(), newValue.getHeight());
JavaFx对于放大/缩小而言过于复杂。为了达到相同的效果,WPF要容易得多。
TA贡献1816条经验 获得超4个赞
我发现James_D的代码存在两个错误(均在onMouseDragged事件处理程序中):double deltaV = deltaY * (scroller.getHmax() - scroller.getHmin()) / extraHeight;应该是,double deltaV = deltaY * (scroller.getVmax() - scroller.getVmin()) / extraHeight;但由于默认情况下两者均为1和0,因此结果是相同的。另一种是,getVvalue()和getHvalue()有时返回NaN,和值仍停留。解决方法是检查Double.isNaN(double value)。如果是,请将其设置为0。希望它能对某人有所帮助。谢谢@jewelsea,您的回答对我很有帮助 :)
添加回答
举报