2016-07-24 88 views
1

我有以下结构:JavaFX的:缩放和滚动不能正常工作

ScrollPane 
    Pane 
     A set of children as ImageView 

下面的类从我得到了(将在后面添加链接,现在不能找到它)

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); 

当我放大,有当我咗一个很奇怪的行为 - om中,两侧的滚动条不会出现。如何使这些酒吧出现?

据我所知,放大缩小了内部面板的尺寸,当它比滚动面板更大时,滚动面板上必须出现边条。

回答

1

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(); 
       } 
      } 
     }); 
    } 
+0

它的工作原理!谢谢! – Alex