我在Observable通知我的Observer更新方法时遇到了麻烦

时间:2015-01-23 18:37:53

标签: java observable observers

这是我的Observer类:

public class GUIController implements Observer {

private AutoRefresh ar;
private Java_SystemTray jst;

public GUIController(){

    ar=new AutoRefresh();
    jst=new Java_SystemTray();

    jst.addObserver(this);
    ar.addObserver(this);

    actionAdderButtons(gui.getButtons());
    TLRefresher();

}

@Override
public void update(Observable arg0, Object arg1) {
    if(arg0==jst){

        gui.onSysTrayClick();

    }
    if(arg0==ar){

        try {
            gui.refreshTL();
        } catch (TwitterException e) {
            e.printStackTrace();
        }

    }

}
}

这些是我的Observable类:

public class AutoRefresh extends Observable implements Runnable {

@Override
public void run() {
    while(!Thread.currentThread().isInterrupted())
    {
      try {
          Thread.sleep(90000);  
          setChanged();
          notifyObservers();
      } catch(InterruptedException ex) {
          Thread.currentThread().interrupt();
      }
    }
}
}



public class Java_SystemTray extends Observable{

public void systray_show(){
    String iconPath = "res/Twitter_logo_blue.png";

        SystemTray systemTray = SystemTray.getSystemTray();
        TrayIcon trayIcon = new TrayIcon(new ImageIcon(iconPath, "omt").getImage(), "Twitter Poster");
        trayIcon.setImageAutoSize(true);

        MouseAdapter mouseAdapter = new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                systemTray.remove(trayIcon);
                setChanged();
                notifyObservers();
            }
        };
        trayIcon.addMouseListener(mouseAdapter);
        try {
            systemTray.add(trayIcon);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
}

我试图尽可能地减少,我希望它仍然可以解决问题。不要试图用我的代码打扰你,但我觉得我必须发布一两行以上,因为我似乎无法弄清楚问题。

但是,我的问题是,我的代码通过了我的setChanged();和notifyObservers(); ,但我的Observers更新方法根本没有被调用。这是我第一次与观察员和观察者一起工作,但我真的不明白我在这里做错了什么。

我也不太清楚如何确定问题所在。要么Observable没有正确通知Observer类,要么根本没有调用Observers update方法。可能两者兼而有之,我真的不知道。

正如我所说,我做了一些检查是否setChanged();和notifyObservers();正在通过,他们确实没有发现任何错误。我现在真的迷失了,因为我觉得我根据我读过的文档和教程做了一切。

如果有人可以帮助我,我会非常感激!

编辑:我可以收集更多信息。显然,setChanged();工作,这意味着Observable被标记为"已更改"。

1 个答案:

答案 0 :(得分:0)

这里的主要问题是AutoRefresh Runnable没有运行,所以你需要一个

ar.run()

声明在那里。有了它,它将起作用。

在注释中 - OP表示正在执行某些线程代码,而在另一个版本中没有调用ar.run()。没有看到代码,我无法确定,但我的猜测是在对象构造函数中调用了一些函数。如果在对象构造函数中调用this.run(),甚至可以在构造上运行该对象。显然,如果没有看到显示报告行为的确切代码,这是一种猜测。