【发布时间】:2025-12-17 10:25:01
【问题描述】:
我有一个观察者,我的 Window 类。我有一个扩展 Observable 的模型类,其中包含一个 ImagePanel 类和一个 Controller 类。我确实将窗口添加到我的模型实例中。
我的问题是:我在model.notifyObservers() 之前进行了打印,它有效,在此调用之后再次打印,它也有效。但是我的 Observer 方法的update() 里面的打印没有出现?
我从我的控制器中调用这个 setImage 方法:
public void setImage(File file)
{
try
{
image = ImageIO.read(file);
fileName = file.getPath();
} catch (IOException e)
{
e.printStackTrace();
}
width = image.getWidth();
height = image.getHeight();
imageType = image.getType();
pixels = new int[width * height];
image.getRGB(0, 0, width, height, pixels, 0, width);
this.setLocation(1000, 500);
System.out.println("ALRIGHT2");
model.change();
if (model.hasChanged())
{
System.out.println("ALRIGHT5");
model.notifyObservers();
System.out.println("ALRIGHT6");
}
}
这是我的观察者的更新方法:
public void update(Observable o, Object arg) {
System.out.println("ALRIGHT3");
image_panel.repaint();
scrollPaneImage.repaint();
}
我在我的 Observer 构造函数中做到了这一点:model.addObserver(this);
怎么了?我假设我通过 JFileChooser 选择的图像不会更新,因为没有调用此方法...
【问题讨论】:
-
您没有显示创建观察者实例的位置,这意味着我们应该如何知道它何时被添加?请提供更多信息。
-
是的,我们需要更多信息来帮助您。
-
我在我的主函数中创建了我的观察者实例,在我的程序入口点。包含这个主函数的类在另一个包中,而不是包含我的观察者的包中,如果它可以提供帮助的话。
-
已解决!很抱歉给您带来不便,我的 JScrollPane 包含一个 JLabel,它本身包含一个 ImageIcon,我忘记更新这个 ImageIcon...
标签: java swing observer-pattern