JavaFX-获取一个ImageView的图像并将其分配给另一个ImageView

时间:2017-07-24 19:47:35

标签: java javafx imageview

我正在做一个应用程序,用户通过单击图像(ImageView1)可以在另一个ImageView2中看到它。所以我试着在变量

中获取ImageView1的图像
BufferedImage img= SwingFXUtils.fromFXImage(ImageView1.getImage(), null);

然后将该变量分配给ImageView2

ImageView2.setImage(SwingFXUtils.toFXImage(img, null));

但是,似乎setImage成功完成,但ImageView2没有显示任何内容。有谁可以帮我找到更好的解决方案?

以下是代码示例: 控制器。 ImageView1

@FXML
private void HandleMousePressedOnImageOne()
{
    BufferedImage img= SwingFXUtils.fromFXImage(ImageOne.getImage(), null);

    try
    {       
        ImageSelection imgSelection= ImageSelection.getImageSelectionInstance();
        imgSelection.SetBufferedImageOne(img);

        FXMLLoader loader= new FXMLLoader();
        SplitPane p= loader.load(getClass().getResource("ImageSelection.fxml").openStream());
        ImageSelectionController imgSelectionController= (ImageSelectionController)loader.getController();

        imgSelectionController.HandleImageOne();
        System.out.println("Image One has been Pressed!");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

Model.ImageSelection

public class ImageSelection {
private BufferedImage bufferedImageOne;

private static ImageSelection imageSelectionInstace= new ImageSelection();

private ImageSelection(){}

public static ImageSelection getImageSelectionInstance()
{
    return imageSelectionInstace;
}

public void SetBufferedImageOne(BufferedImage img)
{
    this.bufferedImageOne= img;
}

public BufferedImage getBufferedImageOne()
{
    return this.bufferedImageOne;
}

}

Controller2.ImageView2

public void HandleImageOne(){
    ImageSelection imgSelection= ImageSelection.getImageSelectionInstance();
    BufferedImage img= imgSelection.getBufferedImageOne();
    ImageOne.setImage(SwingFXUtils.toFXImage(img, null));
}

1 个答案:

答案 0 :(得分:1)

您的代码无效,因为您正在加载FXML文件ImageSelection.fxml中定义的UI的新副本。您不显示此新副本。从加载该UI副本并调用

的加载器检索控制器时
imgSelectionController.HandleImageOne();

您更改了属于该新UI实例的ImageView中的图像。由于未显示该实例,因此您看不到该调用的任何效果。

更好的方法是避免第一个控制器依赖于代码中的第二个控制器,在模型中创建ObjectProperty<Image>,并从第二个控制器观察它:

public class ImageSelection {

    private final ObjectProperty<Image> image = new SimpleObjectProperty<>();

    private static ImageSelection imageSelectionInstance= new ImageSelection();

    private ImageSelection(){}

    public static ImageSelection getImageSelectionInstance() {
        return imageSelectionInstance;
    }

    public ObjectProperty<Image> imageProperty() {
        return image ;
    }

    public final void setImage(Image image) {
        imageProperty().set(image);
    }

    public final Image getImage()
    {
        return imageProperty().get();
    }

}

并在第二个控制器中,执行

public class ImageSelectionController {

    @FXML
    private ImageView imageOne ;

    public void initialize() {
        ImageSelection.getImageSelectionInstance().imageProperty()
            .addListener((obs, oldImage, newImage) -> imageOne.setImage(newImage));
    }

    // ...
}

现在,第一个控制器需要做的就是在模型中设置图像:

@FXML
private void handleMousePressedOnImageOne() {
    ImageSelection.getImageSelectionInstance().setImage(imageOne.getImage());
}

请注意,绝对不需要将JavaFX图像转换为BufferedImage并返回。

我还建议不要使用单身模式,对于一些(记录良好;只是谷歌“使用单身人士有什么问题”)的原因。创建一个实例并将其传递给每个控制器,或使用依赖注入框架为您管理它。