I'm using javafx for developing an application. My objective is scaling the Pane (which is zooming - although I still have doubts if scaling is same as zooming - please clarify if wrong).
I'm able to scale and translate the pane inside the ScrollPane, but now how can I get its new scaled width and height??
slider.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue, Number newValue) {
pane.setScaleX(newValue.doubleValue());
pane.setScaleY(newValue.doubleValue());
pane.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
pressedX = event.getX();
pressedY = event.getY();
}
});
pane.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
pane.setTranslateX(pane.getTranslateX() + event.getX() - pressedX);
pane.setTranslateY(pane.getTranslateY() + event.getY() - pressedY);
event.consume();
}
});
if(newValue.intValue()==1) {
pane.setScaleX(1.0);
pane.setScaleY(1.0);
pane.setTranslateX(0.0);
pane.setTranslateY(0.0);
pane.setTranslateZ(0.0);
}
Platform.runLater(new Runnable() {
@Override
public void run() {
scrollPane.setPrefWidth(pane.getWidth()*pane.getScaleX());
scrollPane.setPrefHeight(pane.getHeight()*pane.getScaleY());
pane.resize(scrollPane.getPrefWidth(),
scrollPane.getPrefHeight());//Here once pane is resized, ResizableCanvas also draws
for(int i=0;i<canvas.length;i++){
canvas[i].setScaledWidth(scrollPane.getPrefWidth());
canvas[i].setScaledHeight(scrollPane.getPrefHeight());
}
mChart.redrawAllAgain();//redraw whole chart again with resized canvas
}
});
}
});
I need this new width and height to resize a canvas and redraw inside it. Please note that in my start of the application, I'm binding some properties.
resizableCanvas1.widthProperty().bind(pane.widthProperty());
resizableCanvas1.heightProperty().bind(pane.heightProperty());
I'm using a ResizableCanvas.java public class ResizableCanvas extends Canvas {
private double scaledWidth;
private double scaledHeight;
private boolean once = true;
public ResizableCanvas() {
// Redraw canvas when size changes.
widthProperty().addListener(evt -> draw());
heightProperty().addListener(evt -> draw());
System.out.println("Canvas: "+scaledWidth+","+scaledHeight);
}
private void draw() {
double width = getWidth();
double height = getHeight();
if(once) {
scaledWidth = width;
scaledHeight = height;
}
GraphicsContext gc = getGraphicsContext2D();
gc.clearRect(0, 0, width, height);
gc.setFill(Color.BLACK);
gc.fillRect(0,0,width, height);
gc.setStroke(Color.RED);
gc.strokeLine(0, 0, width, height);
gc.strokeLine(0, height, width, 0);
}
@Override
public boolean isResizable() {
return true;
}
@Override
public double prefWidth(double height) {
return getWidth();
}
@Override
public double prefHeight(double width) {
return getHeight();
}
public void setScaledDimension(boolean is) {
this.once = is;
}
public void setScaledWidth(double sWidth) {
this.scaledWidth = sWidth;
}
public void setScaledHeight(double sHeight) {
this.scaledHeight = sHeight;
}
public double getScaledWidth() {
return this.scaledWidth;
}
public double getScaledHeight() {
return this.scaledHeight;
}
}