为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX正确缩放

JavaFX正确缩放

繁花不似锦 2019-10-19 14:29:41
我想在滚动事件上缩放窗格中的所有节点。到目前为止我尝试过的是:当我执行scaleX或scaleY时,窗格的边框分别缩放(设置Pane style时可见-fx-border-color: black;)。因此,如果我不是从窗格的边界开始,并非所有事件都会开始,因此我需要全部。下一步,我尝试缩放每个节点,结果确实很糟糕,像这样-(线穿过点延伸)。或者如果滚动到另一侧,它会更少我尝试的另一种方法是缩放Node的点。更好,但我不喜欢它。看起来像 point.setScaleX(point.getScaleX()+scaleX)y以及其他适当的节点。
查看完整描述

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要容易得多。


查看完整回答
反对 回复 2019-10-19
?
繁华开满天机

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,您的回答对我很有帮助 :) 

查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 1688 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信