JavaFX ScrollPane和内容缩放

时间:2017-04-27 18:12:54

标签: javafx imageview scrollpane

我想在ScrollPane中使用ZoomIn和ZoomOut函数将照片显示为ImageView。但是,如果我通过缩放比例缩小图像视图,则会在ScrollPane中创建不合需要的空边。如何确保ScrollPane始终与缩放 ImageView的大小相同? 请参阅以下示例。为简单起见,我用一个矩形替换了ImageView。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ScrollPaneDemo extends Application {

    double scale;
    Pane contPane = new Pane();

    @Override
    public void start(Stage primaryStage) {
        BorderPane pane = new BorderPane();
        ScrollPane sp = new ScrollPane();
        sp.setContent(contPane);
        sp.setVvalue(0.5);
        sp.setHvalue(0.5);
        Rectangle rec = new Rectangle(2820, 1240,Color.RED);
        scale = 0.2;
        contPane.setScaleX(scale);
        contPane.setScaleY(scale);

        contPane.getChildren().add(rec);

        Button but1 = new Button("+");        
        but1.setOnAction((ActionEvent event) -> {
            scale*=2;
            contPane.setScaleX(scale);
            contPane.setScaleY(scale);
        });
        Button but2 = new Button("-");
        but2.setOnAction((ActionEvent event) -> {
            scale/=2;
            contPane.setScaleX(scale);
            contPane.setScaleY(scale);
        });
        HBox buttons = new HBox(but1, but2);
        pane.setTop(buttons);
        pane.setCenter(sp);
        Scene scene = new Scene(pane, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 个答案:

答案 0 :(得分:1)

使用转换缩放的

contPane不会自动更改其layoutBounds。如果您不想在contPane中创建空白区域,则最好将该节点包装在Group中。

看这篇文章。 Layout using the transformed bounds

sp.setContent(new Group(contPane));

此外,如果您不想在ScrollPane 中创建空格,请限制最小比例以评估内容的宽度或高度是否适合视口的一个。

Button but1 = new Button("+");
but1.setOnAction((ActionEvent event) -> {
    updateScale(scale * 2.0d);
});
Button but2 = new Button("-");
but2.setOnAction((ActionEvent event) -> {
    updateScale(scale / 2.0d);
});
HBox buttons = new HBox(but1, but2);
pane.setTop(buttons);
pane.setCenter(sp);
Scene scene = new Scene(pane, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();

updateScale(0.2d);
private void updateScale(double newScale) {
    scale = Math.max(newScale, Math.max(sp.getViewportBounds().getWidth() / rec.getWidth(), sp.getViewportBounds().getHeight() / rec.getHeight()));
    contPane.setScaleX(scale);
    contPane.setScaleY(scale);
}

考虑一个图像小于ScrollPane视口的情况。因为没有显示空格,所以当代码没有足够的大小时,此代码将拉伸内容。

如果图像太大,TravisF的评论可以帮助您。