gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:35:18 29 4
gpt4 key购买 nike

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

BufferedImage img= SwingFXUtils.fromFXImage(ImageView1.getImage(), null);

然后将该变量分配给 ImageView2

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

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

这里是代码示例: Controller 。 ImageView 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;
}

}

Controller2.ImageView2

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

最佳答案

您的代码不起作用,因为您正在加载 FXML 文件 ImageSelection.fxml 中定义的 UI 的新副本。您不显示这个新副本。当您从加载 UI 副本的加载器检索 Controller 并调用

imgSelectionController.HandleImageOne();

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

更好的方法是创建一个 ObjectProperty<Image> ,这也可以避免您的第一个 Controller 像代码中那样依赖于第二个 Controller 。在您的模型中,并从第二个 Controller 观察它:

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

}

然后在第二个 Controller 中执行

public class ImageSelectionController {

@FXML
private ImageView imageOne ;

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

// ...
}

现在第一个 Controller 需要做的就是在模型中设置图像:

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

请注意,绝对不需要从 JavaFX 图像转换为 BufferedImage然后返回。

我还建议不要使用单例模式,原因有很多(有详细记录;只需谷歌“使用单例有什么问题”)。创建一个实例并将其传递给每个 Controller ,或使用依赖项注入(inject)框架来管理它。

关于JavaFX-获取一个 ImageView 的图像并将其分配给另一个 ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45288878/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com