2016-10-25 8 views
0

ノードのグループがあります。追加される最初のノードは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

ScrollPaneは、boundsInParentではなく、the layoutBounds propertyを使用してサイズを決定します。 layoutBoundsには変換が含まれていません。 layoutBoundsは、変換が適用される前のNodeのジオメトリによって決まるサイズにすぎません。したがって、ScrollPaneは、まだサイズがの変換されていないcontentのサイズであるとみなします。あなたがGroupの子供に変換を適用できるのいずれかこの問題を解決するには

(それは自分のサイズだ決定する際Groupは、アカウントに子供の変換を取る)

// group.getTransforms().add(scaleTransformation); 
viewer.getTransforms().add(scaleTransformation); 

または別のGroup

contentを包みます
sp.setContent(new Group(group)); 

Groupに複数のノードを追加する場合は、2番目の方法を使用する必要があります。

+0

第2のアプローチは良い考えでした。 「ノード自体の変換はコンテンツノードのサイズを決定するためには適用されません」という意味をさらに説明できますか?サイズの変更は伝播されませんか? –

+0

@ Mr.Mountainこれは、 'ScrollPane'がコンテンツのサイズを決定するのに適切と考える方法で伝播されません。私は説明を少し改めました。 – fabian

関連する問題