2016-07-24 10 views
1

Ich habe die folgende Struktur:JavaFX: Zoom und Scroll funktionieren nicht richtig

ScrollPane 
    Pane 
     A set of children as ImageView 

Die folgende Klasse I aus bekam (wird später den Link hinzufügen, kann es jetzt nicht finden)

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

und unterhalb der Linie knittert das Objekt:

zoomController = new ZoomController(pane); 

wenn ich in bin Zoomen, gibt es eine sehr seltsame verhaltens- ist, wenn ich zo om in, Bildlaufleisten an den Seiten erscheinen nicht. Wie werden diese Balken angezeigt?

Wie ich verstehe, ändert die Vergrößerung die Größe des inneren Panels und wenn es größer als das Rollfeld wird, muss auf dem Bildlauffeld Seitenbalken erscheinen.

Antwort

1

Die Eigenschaften scale werden in der Größenberechnung für den Inhalt des ScrollPane nicht berücksichtigt. Um dies zu beheben, kann der Inhalt in eine Group verpackt werden. Desweiteren könnte eigentlich das Setzen des Inhaltes helfen. Übrigens sollten Sie in einem Listener keine Bindung zur Quelle dieser Bindung herstellen. Erstellen Sie entweder innerhalb eines Zuhörers eine Bindung an diese Eigenschaft

content.scaleXProperty().bind(zoom); 
content.scaleYProperty().bind(zoom); 

oder den Wert gesetzt:

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

Es funktioniert! Vielen Dank! – Alex

Verwandte Themen