我在 Observable 通知我的 Observer 更新方法时遇到了问题
I have trouble with Observable notifying my Observer update method
这是我的观察者class:
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 classes:
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();
}
}
}
我尽量删掉了,希望还是转移问题。不想用我的代码打扰你,但我觉得我必须 post 多写一两行,因为我似乎根本无法找出问题所在。
但是,我这里的问题是,我的代码通过了我 setChanged(); 的段落。和 notifyObservers(); ,但我的观察者更新方法根本没有被调用。这是我第一次与观察者和可观察者一起工作,但我真的不明白我在这里做错了什么。
我也不太确定如何检查问题的确切位置。要么 Observables 没有正确通知 Observer class,要么 Observers 更新方法根本没有被调用。可能两者都是,我真的不知道。
正如我所说,我做了一些检查是否 setChanged();和 notifyObservers();正在通过,而且确实如此,没有排除任何错误。我现在真的迷路了,因为我觉得我按照我阅读的文档和教程做了所有事情。
如果有人能帮助我,我将不胜感激!
编辑:我可以收集更多信息。显然,setChanged();有效,这意味着 Observable 被标记为 "Changed".
这里的主要问题是 AutoRefresh Runnable 没有 运行,所以你需要一个
ar.run()
声明在那里。这样就可以了。
在评论中 - OP 表示正在执行某些线程代码,而 ar.run()
未在另一个版本中调用。没有看到代码,我不能确定,但我的猜测是在对象构造函数中调用了一些函数。如果在对象构造函数中调用 this.run() ,甚至可以 运行 构造对象。显然,这是一种猜测,没有看到表现出所报告行为的确切代码。
这是我的观察者class:
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 classes:
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();
}
}
}
我尽量删掉了,希望还是转移问题。不想用我的代码打扰你,但我觉得我必须 post 多写一两行,因为我似乎根本无法找出问题所在。
但是,我这里的问题是,我的代码通过了我 setChanged(); 的段落。和 notifyObservers(); ,但我的观察者更新方法根本没有被调用。这是我第一次与观察者和可观察者一起工作,但我真的不明白我在这里做错了什么。
我也不太确定如何检查问题的确切位置。要么 Observables 没有正确通知 Observer class,要么 Observers 更新方法根本没有被调用。可能两者都是,我真的不知道。
正如我所说,我做了一些检查是否 setChanged();和 notifyObservers();正在通过,而且确实如此,没有排除任何错误。我现在真的迷路了,因为我觉得我按照我阅读的文档和教程做了所有事情。
如果有人能帮助我,我将不胜感激!
编辑:我可以收集更多信息。显然,setChanged();有效,这意味着 Observable 被标记为 "Changed".
这里的主要问题是 AutoRefresh Runnable 没有 运行,所以你需要一个
ar.run()
声明在那里。这样就可以了。
在评论中 - OP 表示正在执行某些线程代码,而 ar.run()
未在另一个版本中调用。没有看到代码,我不能确定,但我的猜测是在对象构造函数中调用了一些函数。如果在对象构造函数中调用 this.run() ,甚至可以 运行 构造对象。显然,这是一种猜测,没有看到表现出所报告行为的确切代码。