2

オーバーレイで画像を表示したいプロジェクトに取り組んでいます。

私のアイデアは、AncorPaneを作成し、その背景にImageViewを配置してから、その上にいくつかの図形を配置することでした。これは機能します。

画像は非常に大きいため、使用可能なスペースに応じて縮小する必要があります。言うまでもなく、画像に対して同じ場所にとどまるすべてのオーバーレイ形状を縮小する必要があります。視覚的には、これはスケール変換をAncorPaneに適用することでも機能しますが、ここに問題があります。

AncorPaneは、そのサイズを子から取得します。ただし、縮小されても、AncorPaneは変換されていない画像のサイズのままです。これにより、大量の空白が作成されます。レイアウトの境界と、サイズ変更不可能なノードの親の境界との間の不一致に問題があると思います。

この不要な空白を取り除く別の方法で、AncorPane鉱石の実際のサイズを設定することについて誰かが提案していますか?

例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;


public class test extends Application
{
    @Override
    public void start(final Stage stage) throws Exception
    {
        final ScrollPane scroll = new ScrollPane();
        final Scene scene = SceneBuilder.create().root(scroll).build();
        final VBox box = new VBox();

        final AnchorPane anchorPane = new AnchorPane();
        final ImageView imageView = new ImageView();
        final Shape overlayRectangle = new Rectangle(100, 100, 100, 100);

        scroll.setContent(box);
        box.getChildren().add(anchorPane);
        anchorPane.getChildren().addAll(imageView, overlayRectangle);
        overlayRectangle.toFront();

        imageView.setImage(new Image("http://cdn.sstatic.net/stackoverflow/img/sprites.png"));

        final Scale scale = new Scale(0.5, 0.5);
        anchorPane.getTransforms().add(scale);

        stage.setScene(scene);
        stage.show();
    }

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

例を実行すると、ウィンドウサイズを画像サイズの2倍に拡大した場合にのみ、スクロールバーが消えることがわかります。スクロールバーを無効にできることはわかっています。これはサンプルコードで機能する可能性がありますが、この例は大幅に短縮されていることに注意してください。動的なサイズ変更もカットしました。

4

2 に答える 2

1

誰かがこれを見つけた場合に備えて、 ScrollPaneのドキュメントからの引用で自分の質問に答えます。

ScrollPaneレイアウトの計算は、スクロールノードのboundsInParent(視覚的な境界)ではなく、layoutBoundsに基づいています。アプリケーションが(スケーリングされたコンテンツなどの)ノードの視覚的境界に基づいてスクロールすることを望む場合、アプリケーションはスクロールノードをグループでラップする必要があります。

于 2013-01-15T08:41:58.327 に答える
0

問題はあなたのせいです

  final Scale scale = new Scale(0.5, 0.5);
  anchorPane.getTransforms().add(scale);

すでにあるのでスケールを削除しsizeToSceneますが、あなたはそれを再定義しています。それはあなたの問題を解決しますか?

また、scale()メソッドの引数を変更して、空白の問題を増減します(ズーム効果の一種)。

または、削除する場合は、次のように変更します。

 final Scale scale = new Scale(1,1);
 anchorPane.getTransforms().add(scale);
于 2013-01-10T11:23:27.403 に答える