我正在做一个应用程序,用户通过单击图像(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));
}
答案 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
并返回。
我还建议不要使用单身模式,对于一些(记录良好;只是谷歌“使用单身人士有什么问题”)的原因。创建一个实例并将其传递给每个控制器,或使用依赖注入框架为您管理它。