JavaFX正确缩放

我想在滚动事件上缩放窗格中的所有节点。


到目前为止我尝试过的是:


当我执行scaleX或scaleY时,窗格的边框分别缩放(设置Pane style时可见-fx-border-color: black;)。因此,如果我不是从窗格的边界开始,并非所有事件都会开始,因此我需要全部。

http://img.mukewang.com/5daaad80000186cc06410509.jpg

下一步,我尝试缩放每个节点,结果确实很糟糕,像这样-(线穿过点延伸)。或者如果滚动到另一侧,它会更少

http://img3.mukewang.com/5daaad880001f56f05080434.jpg

我尝试的另一种方法是缩放Node的点。更好,但我不喜欢它。看起来像 point.setScaleX(point.getScaleX()+scaleX)y以及其他适当的节点。


繁花不似锦
浏览 1689回答 3
3回答

猛跑小猪

如果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 sizecanvasPane.setMinSize(newValue.getWidth(), newValue.getHeight());JavaFx对于放大/缩小而言过于复杂。为了达到相同的效果,WPF要容易得多。

繁华开满天机

我发现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,您的回答对我很有帮助 :) 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java