Warm tip: This article is reproduced from serverfault.com, please click

其他-如何在FXML(JavaFX)中制作自适应ImageView

(其他 - How can I make responsive ImageView in FXML (JavaFX))

发布于 2020-11-28 18:14:28

我有一个显示3张图像的场景,我希望它们中的每一个都占据场景宽度的三分之一。从现在开始,我制作了30%的3个窗格,它可以正常工作。但是在那些窗格中,我不能使ImageView仅使用窗格的宽度。

<GridPane GridPane.rowIndex="1" GridPane.columnIndex="0">
        <ImageView GridPane.columnIndex="0" fx:id="imgChasseur" preserveRatio="true" onMouseClicked="#handleChoixChasseur"/>
        <ImageView GridPane.columnIndex="1" fx:id="imgMage" preserveRatio="true" onMouseClicked="#handleChoixMage"/>
        <ImageView GridPane.columnIndex="2" fx:id="imgGuerrier" preserveRatio="true" onMouseClicked="#handleChoixGuerrier"/>
    <columnConstraints>
        <ColumnConstraints percentWidth="33" />
        <ColumnConstraints percentWidth="33" />
        <ColumnConstraints percentWidth="33" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints percentHeight="100" />
    </rowConstraints>        
</GridPane>

在那段代码示例中,我看不到这三个,因为它们很大,而在3 ImageView中使用'fitWidth =“ 100”'时,它们太小了。

我了解的方式是'fitWidth'以像素为单位工作,但这不是响应方式,因此对我没有太大帮助...

GridPane是唯一具有百分比值的窗格,因此我认为它可以帮助我使它们具有响应能力,但事实并非如此。有没有办法,无论我应该使用哪种窗格?

Questioner
QDelage
Viewed
11
QDelage 2020-11-29 22:00:58

我找到了一个解决方案:我在周围的窗格上添加了一个侦听器,该侦听器在Controller中修改了ImageView的fitWidth

    paneOriginal.widthProperty().addListener((ChangeListener<? super Number>) new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
            imgChasseur.setFitWidth(paneOriginal.getWidth() / 3);
            imgMage.setFitWidth(paneOriginal.getWidth() / 3);
            imgGuerrier.setFitWidth(paneOriginal.getWidth() / 3);
        }
    });

这样,我可以随时调整场景大小,并且仍然适合场景(当然,我必须在加载FXML时至少一次调用这三行代码)。