image - JavaFX 更改 imageView 中的图像

标签 image graphics javafx scene

基本上,我有一种方法可以将图像从数据库加载到 imageView 中,还有第二种方法可以更改图像,我成功地运行了这两种方法而没有出现异常,但是在 setImage in changeImage() 方法之后我需要做什么更新以及(场景、舞台)如何可能。我知道javafx中的swing中没有像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;
    }

最佳答案

您的问题

如果您的 Controller 中有一个使用 @FXML 注入(inject)的成员节点,则永远不应该使用 new 构造函数创建新对象实例并分配该新对象到您现有的引用。相反,只需使用 FXML 为您创建的对象即可。

你有:

@FXML
private ImageView img_1;

没关系。

然后在loadImg中,你有:

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

这很糟糕。

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

如何修复

所以你需要做的就是停止创建新的 ImageView 并只写:

img_1.setImage(newImg);

你就完成了。

为什么有效

ImageView的Image属性是一个可观察的属性。 JavaFX 系统观察 Image 属性的任何更改,如果发生更改,则会自动更新 ImageView 屏幕上显示的图像。您不需要执行任何重绘调用(在任何情况下都没有这样的重绘例程可以调用)。

背景阅读

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

一些提示

  • 您可以create a JavaFX image directly from an InputStream ,您不需要使用 ImageIO 和 SwingFXUtils 来完成此任务。
  • 您可以使用 Task与数据库通信,您的应用程序的响应速度可能会更快。
  • 从文件或通过 http 读取图像可能比从数据库读取图像更简单。

免责声明

除了此处指出的问题之外,您未提供的代码中可能还存在其他错误,这可能会阻止您的应用程序按您希望的方式运行。

关于image - JavaFX 更改 imageView 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500761/

相关文章:

iOS7 : What is the best way to give the user the ability to choose between taking a photo and going to a photo gallery?

linux - Nvidia驱动安装未满足的依赖

c# - 2D图形优化技巧

java - 需要一种在 listcell (javafx) 中应用 css 的方法

java - 左对齐 JavaFX 固定宽度选项卡 Pane 中的选项卡标签

image - 如何在 JSF + Primefaces 3.2 中渲染图像

android - 在 android 和所有屏幕尺寸中插入图像

java - 如何通过 XML 将图像添加到 Android TextView

c++ - 使用 SDL2 在每一帧上渲染屏幕的一部分

javafx - 如何在 JavaFx8 中获取场景 Controller ?