ノードのグループがあります。追加される最初のノードはImageView
です。 このグループは、スクロール可能なペインのコンテンツの子ノードとして設定されます。 グループは、グループのサイズを変更するために縮尺変換にバインドされています。JavaFX ScrollPaneスクロールバーが含まれていないと表示されないノードのグループがズームされている
CTRLとマウスホイールが使用されているかどうかを認識するために、スクロール可能なペインにイベントフィルタを追加した場合。これにより、必要な拡大/縮小操作が作成されるはずです。
問題は、スクロール可能なペインがズームしたグループまたはズームアウトしたグループに応じてバーを変更していないことです。ここで
は、コードスニペット
Group group = new Group();
ScrollPane sp = new ScrollPane();
sp.setHbarPolicy(ScrollBarPolicy.ALWAYS);
sp.setVbarPolicy(ScrollBarPolicy.ALWAYS);
sp.setContent(group);
InputStream is = MaApplication.class.getResourceAsStream("test.jpg");
Image img = new Image(is);
ImageView viewer = new ImageView(img);
viewer.setFitWidth(600);
viewer.setPreserveRatio(true);
viewer.setDisable(true);
viewer.setCache(true);
group.getChildren().add(viewer);
DoubleProperty zoomProperty = new SimpleDoubleProperty(1);
Scale scaleTransformation = new Scale();
scaleTransformation.xProperty().bind(zoomProperty);
scaleTransformation.yProperty().bind(zoomProperty);
group.getTransforms().add(scaleTransformation);
sp.addEventFilter(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
if (event.isControlDown() && event.getDeltaY() > 0) {
zoomProperty.set(zoomProperty.get() * 1.1);
} else if (event.isControlDown() && event.getDeltaY() < 0) {
zoomProperty.set(zoomProperty.get()/1.1);
}
}
});
は、私はそれが別の例で使用されるようStackPane
インスタンスを使用したくないです。代わりにGroup
を使用してこれを解決する必要があります。 この質問が重複している場合は、コメントを追加してください。
第2のアプローチは良い考えでした。 「ノード自体の変換はコンテンツノードのサイズを決定するためには適用されません」という意味をさらに説明できますか?サイズの変更は伝播されませんか? –
@ Mr.Mountainこれは、 'ScrollPane'がコンテンツのサイズを決定するのに適切と考える方法で伝播されません。私は説明を少し改めました。 – fabian