当前位置: 首页 > 知识库问答 >
问题:

ImageView总是在场景大小之外缩放,似乎不能强迫它适应

常炯
2023-03-14

我是JavaFX新手(使用swing已经很长时间了),并且正在尝试使用BorderPane。人们会认为BorderPane类似于BorderLayout,但最大的区别是BorderPane的中心将扩展以适应其内容,而BorderLayout将收缩以适应窗口。

我在JFrame中使用JFXPanel,有一个3部分的界面:左边的面板(一些文本),底部的一些按钮(流控制),在中心想要有一个动态面板/窗格,在大部分情况下只是一个ImageView。我把它都设置好了,它工作得很好,但我在这里使用的相机图像比我的显示器大得多。我尝试通过将imageview的宽度绑定到不同的东西(如锚窗格、场景大小(工作,但不正确)等)来缩放图像。我遇到的问题是,由于BorderPane的中心面板扩展以适应其内容,它将扩展,并且永远不会有一个合适的值可以绑定。我需要图像在窗口中以任何大小都完全可见。

这是我一直在使用的代码

protected void setupFXWindow(JFXPanel mainPanel) {
    butNext = new Button("Next Step");
    butBack = new Button("PreviousStep Step");
    butQuit = new Button("Cancel Signature Generation");
    butNext.setTooltip(new Tooltip("Next step..."));
    butBack.setTooltip(new Tooltip("Previous Step..."));
    butQuit.setTooltip(new Tooltip("Quit generating a signature"));

    Group root = new Group();
    Scene scene = new Scene(root, javafx.scene.paint.Color.ALICEBLUE);

    javafx.scene.image.Image fximage = new javafx.scene.image.Image(new File(image.getSourceFilePath()).toURI().toString());
    ImageView iv1 = new ImageView();
    iv1.setImage(fximage);
    iv1.setPreserveRatio(true);
    VBox directionsPanel = new VBox();
    HBox authorflowPanel = new HBox(); //bottom buttons for next, back, etc.
    mainPanel.setScene(scene);

    //INSTRUCTIONS
    directionsStepLabel = new Text();
    directionsLabel = new Text();
    setDirectionsText("Directions will be placed here.");
    exampleLabel = new Text("Example");
    exampleIconLabel = new Text("An example image will be shown here.");

    directionsPanel.setPadding(new javafx.geometry.Insets(5, 5, 5, 5));
    directionsPanel.getChildren().addAll(directionsStepLabel, directionsLabel, exampleLabel);

    authorflowPanel.getChildren().addAll(butBack, butQuit, butNext);

    BorderPane bp = new BorderPane();
    bp.prefHeightProperty().bind(scene.heightProperty());
    bp.prefWidthProperty().bind(scene.widthProperty());
    bp.setLeft(directionsPanel);
    bp.setBottom(authorflowPanel);
    bp.setCenter(iv1);
    root.getChildren().add(bp);
}

上面的代码使其看起来像这样:

共有1个答案

冯良才
2023-03-14

ImageView包装在某种窗格中(例如Stackpane)。然后窗格将填充边框窗格的中心区域,您可以绑定到其宽度和高度:

ImageView iv1 = new ImageView();
iv1.setImage(fximage);
iv1.setPreserveRatio(true);
StackPane imageContainer = new StackPane(iv1);
iv1.fitWidthProperty().bind(imageContainer.widthProperty());
iv1.fitHeightProperty().bind(imageContainer.heightProperty());

// ...

bp.setCenter(imageContainer);
 类似资料:
  • 为了实现类似于minimap的功能,我使用在之上添加了一个。我将的缩放x和y属性绑定到以实现缩放效果。我在中添加了一些对象。这些圆圈当然也应该是可缩放的(它们确实是),但在这种情况下,更重要的是,当缩放发生时,它们应该保持在它们的相对位置。下面的图片显示了GUI到目前为止的样子。 到目前为止,我已经区分了两个有问题的案例。 在这个更简单的例子中,除了放大图像似乎使其超出的边界之外,一切都很好。因此

  • 我在使用Discord。js和一个长时间运行的Discord bot最近由于消息而突然停止工作。成员对象始终为空。 例如: 这始终会产生:TypeError:无法读取null的属性“roles” 在我们查看消息的代码库中,这种错误也随处可见。成员 即使控制台完全记录消息对象,我们也可以肯定地看到成员属性为空。 Discord.js?有什么变化吗?

  • 本文向大家介绍Android中imageView图片放大缩小及旋转功能示例代码,包括了Android中imageView图片放大缩小及旋转功能示例代码的使用技巧和注意事项,需要的朋友参考一下 一、简介 二、方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCenter" 第二步:获取屏幕的宽度 第三步:设置seekBar的最大p

  • 本文向大家介绍Android手势滑动实现ImageView缩放图片大小,包括了Android手势滑动实现ImageView缩放图片大小的使用技巧和注意事项,需要的朋友参考一下 本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTo

  • 本文向大家介绍redis适合场景八点总结,包括了redis适合场景八点总结的使用技巧和注意事项,需要的朋友参考一下 redis适合什么场景? 1、缓存 缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。 2、排行榜 很多网站都有排行榜应用的,如

  • 但它的行为仍然不正确。 我觉得我做错了,但我不知道如何做对。在这样的窗体上重新缩放控件的正确方法是什么?有没有更好的方法来达到我所期待的结果?