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

JavaFX-获取一个ImageView的图像并将其分配给另一个ImageView,java,javafx,imageview,Java,Javafx,Imageview,我正在做一个应用程序,用户通过点击一个图像(ImageView1)可以在另一个ImageView2中看到它。因此,我尝试在变量中获取ImageView1的图像 BufferedImage img= SwingFXUtils.fromFXImage(ImageView1.getImage(), null); 然后将该变量指定给ImageView2 ImageView2.setImage(SwingFXUtils.toFXImage(img, null)); public void Handle

我正在做一个应用程序,用户通过点击一个图像(ImageView1)可以在另一个ImageView2中看到它。因此,我尝试在变量中获取ImageView1的图像

BufferedImage img= SwingFXUtils.fromFXImage(ImageView1.getImage(), null);
然后将该变量指定给ImageView2

ImageView2.setImage(SwingFXUtils.toFXImage(img, null));
public void HandleImageOne(){
    ImageSelection imgSelection= ImageSelection.getImageSelectionInstance();
    BufferedImage img= imgSelection.getBufferedImageOne();
    ImageOne.setImage(SwingFXUtils.toFXImage(img, null));
}
但是,似乎setImage已经成功完成,但ImageView2没有显示任何内容。有人能帮我找到更好的解决方案吗

下面是代码示例: 控制器。图像视图1

@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();
    }
}
模型选择

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;
}
}

控制器2.ImageView2

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

您的代码无法工作,因为您正在加载FXML文件
ImageSelection.FXML
中定义的UI的新副本。您不显示此新副本。从加载UI副本的加载程序中检索控制器并调用

imgSelectionController.HandleImageOne();
您可以在
ImageView
中更改图像,该图像是UI新实例的一部分。由于不显示该实例,因此您看不到该调用的任何效果

更好的方法是在模型中创建
ObjectProperty
,并从第二个控制器观察它,这也避免了第一个控制器与代码中的第二个控制器存在依赖关系:

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();
    }

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

@FXML
private void handleMousePressedOnImageOne() {
    ImageSelection.getImageSelectionInstance().setImage(imageOne.getImage());
}
请注意,绝对不需要将JavaFX图像转换为
buffereImage
并返回


我还建议不要使用单例模式,原因有很多(有很好的文档;只需谷歌“使用单例有什么问题”)。创建一个实例并将其传递给每个控制器,或者使用依赖项注入框架为您管理它。

为什么要使用swing?你能呆在fx里面吗?我不做任何swing is fx,我从这个链接中得到了一些想法,但我不知道这是否适合这种情况?BuffereImage是一个AWT结构,你可以使用swing conversion utils从fx图像转换到这个图像,然后再转换回来。您可以直接使用
javafx.scene.image.image
。前面的注释的意思是:为什么要将javafx图像转换为缓冲图像,然后再转换回javafx图像。
ImageView2.setImage(ImageView1.getImage())有什么问题?但是,如果您发布的代码不起作用,那么更简单的方法也不会起作用。您尚未发布的代码中还有其他错误。非常干净的解决方案。。谢谢你。也谢谢你关于单身的观点。。我学到了很多