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

JavaFX更改图像中的图像视图

仲承福
2023-03-14

基本上,我有一个方法可以将Image从数据库加载到ImageView中,还有第二个方法可以更改图像,我成功地运行了这两个方法,没有出现异常,但是在change eImage()方法中的setImage之后,我需要更新什么以及如何(场景、阶段)是可能的。我知道在javafx中没有像swings中的repaint()这样的方法,那么我该如何处理呢?

public class MainMenuController implements Initializable {

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

    private AnchorPane stck1;

 @FXML
    private AnchorPane openSecondWindow(ActionEvent event) throws Exception {
        GUIController ctrl = new GUIController();
        Stage stage = new Stage();
       setStck1((AnchorPane) FXMLLoader.load(InteractiveFictionGame2.class.getResource("GUI.fxml")));
        ImageView img_1 = new ImageView(ctrl.loadImg().getImage());
        img_1.setPreserveRatio(true);
        img_1.setSmooth(true);
        img_1.setCache(true);
        getStck1().getChildren().add(img_1);
        Scene scene = new Scene(getStck1());
        stage.setTitle("Interactive Fiction Game");
        stage.setScene(scene);
         stage.setFullScreen(true);
       // stage.sizeToScene();
        stage.show();
       return getStck1();
    }






public class GUIController implements Initializable {

    @FXML
    private TabPane tb1;

    /**
     * Initializes the controller class.
     *
     * @param url
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
    @FXML
    private ImageView img_1;





 public ImageView loadImg() {

        try {

            con = DriverManager.getConnection(host, unm, pswrd);
            stmnt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = stmnt.executeQuery(SQL);
            rs.next();
            fis = rs.getBinaryStream(4);
            imgt = javax.imageio.ImageIO.read(fis);
            Image newImg = SwingFXUtils.toFXImage(imgt, null);
            img_1 = new ImageView();
            img_1.setImage(newImg);
            rs.close();
            stmnt.close();

            con.close();
        } catch (Exception e) {
            System.out.println("Not working");
        }
        return img_1;
    }


public void changeImage() {
..
            fis = rs.getBinaryStream(1);
            imgt = javax.imageio.ImageIO.read(fis);
            Image newImg = SwingFXUtils.toFXImage(imgt, null);
            img_1.setImage(newImg);
...
 } catch (Exception e) {
            System.out.println("Not working");
        }
        return img_1;
    }

共有2个答案

顾俊楚
2023-03-14

Java我毕业于这里:
在我的JavaFX学期项目中,我必须在setOnAction事件(单击按钮)时更新imageView对象。这允许程序用户点击一系列图片。

以下操作非常有效:
首先创建图像和ImageView实例:

ImageObject=new Image();
ImageView ImageViewObject=new ImageView();

然后,在代码中,一个按钮事件导致(下一个)图像被分配和更新,如下所示:

btn.setOnAction(e -> {
    imageIndex++;
    imageFilename = imageNamesArray.get(imageIndex);
    imageObject = new Image(imageFilename);  
    imageViewObject.setImage(imageObject);
}

注意:我项目中的文件名是保存为ArrayList()中的String元素的jpg文件(名称)。单击按钮还会将数组索引递增到下一个jpg文件名(以及路径或URL),并且会出现新图像。因此,与前面提到的答案一样,您只创建了一个ImageViewObject,但每次都会将新图像重新分配给图像对象“ImageObject”。

黄伟
2023-03-14

你的问题

如果您的控制器中有一个使用@FXML注入的成员节点,则不应使用new构造函数创建新对象实例并将该新对象分配给您现有的引用。相反,只需使用FXML为您创建的对象。

你有:

@FXML
private ImageView img_1;

那很好。

然后在loadImg中,您有:

img_1 = new ImageView();
img_1.setImage(newImg);

那很糟糕。

您已经有了一个ImageView,FXMLLoader在您加载FXML文档时为您创建了该ImageView。然后,FXML Loader将该ImageView分配给您的img_1引用,因为您使用了@FXML注释。

如何修复它

因此,您只需停止创建新的ImageView,只需编写:

img_1.setImage(newImg);

你就完了。

为什么有效

ImageView的图像属性是可观察的属性。JavaFX系统会观察图像属性的任何更改,如果更改,会自动更新ImageView屏幕上显示的图像。您不需要执行任何重绘调用(在任何情况下都不需要调用此类重绘例程)。

背景阅读

如果您想更好地了解JavaFX场景图架构,请阅读有关它的Oracle教程:

  • 使用JavaFX场景图。

一些提示

  • 您可以直接从InputStream创建JavaFX图像,您不需要为此任务使用ImageIO和SwingFXUtils。
  • 您可以使用Task与数据库通信,您的应用程序可能会更具响应性。
  • 从文件或通过超文本传输协议而不是从数据库中读取图像可能更简单。

免责声明

除了这里指出的问题之外,您没有提供的代码中可能还有其他错误,这些错误可能会阻止您的应用程序按自己的意愿运行。

 类似资料:
  • 我在javafx Grouping中遇到问题。我的程序是在ImageView上绘制一个矩形来裁剪图像。坐标是从鼠标按下和鼠标释放中获得的。当我将组放在GridPane布局中时,矩形没有画在正确的位置。 我的程序是 我的输出屏幕截图是 但矩形应该在图像中查看

  • 我通过图像视图显示了程序中的图标。按下按钮时,黄色图标应变为红色。我尝试了所有方法,但没有一个有效。...背景颜色...他把图像视图变成红色,呈全正方形。我只想让图标改变颜色。这是非常困难的'请帮忙。谢谢。 我的代码:

  • 我想在ImageView中将图像居中。ImageViews用于列表中图片的缩略图,我使用了宽度和高度为90的固定视口,使它看起来更干净。这些图片使用背景加载,所以我不知道图片放入ImageView时的尺寸。当然,我不想拉伸(或裁剪)图像。我在加载图像时使用preserveRatio。有什么方法可以让图像居中,而不是左上角?图像的最长边总是90度。

  • 我正在使用javaFX。我做了一个按钮并为此设置了一个图像。代码是: 但是我想当我点击按钮时,图像会变成另一张图片。我该怎么做呢?

  • 我刚刚在文件夹下添加了一个新的可绘制文件夹。在drawable文件夹中,我复制了ic\U启动器。png文件来自可绘制hdpi文件夹。当我按下按钮时,我想通过新的图像更改标准的图像按钮。我写了一些代码,但当我启动应用程序时,它崩溃了。 编辑:我改成了这个,这个也不行。 编辑2:这很有效。感谢大家。

  • 我对javafx非常陌生。我正试图用scene builder创建一个有趣的纸牌游戏应用程序,但在更改ImageView组件的图像时遇到了问题。 src文件夹包含两个包,一个用于所有图像,另一个包含所有代码。 在控制器类中,我尝试使用以下多种组合来更改图像,其中卡是组件,它与中的匹配: