JavaFX-获取一个ImageView的图像并将其分配给另一个ImageView
我正在做一个应用程序,用户通过点击一个图像(ImageView1)可以在另一个ImageView2中看到它。因此,我尝试在变量中获取ImageView1的图像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
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())有什么问题代码>?但是,如果您发布的代码不起作用,那么更简单的方法也不会起作用。您尚未发布的代码中还有其他错误。非常干净的解决方案。。谢谢你。也谢谢你关于单身的观点。。我学到了很多