【发布时间】:2015-01-23 18:37:52
【问题描述】:
这是我的观察者类:
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(); ,但我的观察者更新方法根本没有被调用。这是我第一次与观察者和可观察者一起工作,但我真的不明白我在这里做错了什么。
我也不太确定如何检查问题的确切位置。 Observables 没有正确通知 Observer 类,或者根本没有调用 Observers 更新方法。可能两者都有,我真的不知道。
正如我所说,我做了一些检查 setChanged();和 notifyObservers();正在通过,他们确实做到了,没有任何错误。我现在真的很迷茫,因为我觉得我所做的一切都是根据我阅读的文档和教程来完成的。
如果有人可以帮助我,我将非常感激!
编辑:我可以收集更多信息。显然, setChanged();有效,这意味着 Observable 被标记为“已更改”。
【问题讨论】:
-
提示:学习使用调试器并在其中放置一些断点。这应该可以帮助您隔离问题。
-
很棒的提示。事实上,这给了我更多的信息。我很快就会编辑我的帖子。
-
我不得不注释掉特定于您的应用程序的行(即 Twitter 特定的行),但在我这样做之后 - 您的代码对我有用。我知道这可能看起来很傻,但是我看不到
ar.run()在您的代码中的任何地方被调用 - 我必须添加它,否则代码只会通过代码路径一次然后完成。我想这不是你的问题。您能否详细说明您的应用程序中还发生了什么?例如构造函数中创建的TLRefresher()对象是什么,GUIController中引用的gui字段是什么类? -
@JRichardSnape 谢谢老兄!一旦我做了 ar.run();它正在工作!你能告诉我这是为什么吗?即使没有在另一个版本的应用程序中调用 run,我的线程代码也在执行,不知何故
-
没有问题 - 我在下面给出了答案 - 希望它能回答问题,您可以投票/接受 :)
标签: java observable observers