【问题标题】:update() call from Observable not called未调用来自 Observable 的 update() 调用
【发布时间】: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


【解决方案1】:

解决了!很抱歉给您带来不便,我的 JScrollPane 包含一个 JLabel,它本身包含一个 ImageIcon,我忘记更新这个 ImageIcon...

【讨论】: