为什么GUI不在Observer模式中更新?

时间:2015-11-01 14:38:50

标签: java swing observer-pattern

我有Observable类,它在字符串更改时通知观察者。在观察者的更新方法中,可以将更新的字符串打印到控制台。但GUI没有相应更新。为什么呢?

public void update(Observable o, Object arg) {

    String s=SwimmingCompetition.init().getScoreData().getResults();
    System.out.println(s); //this works
    jTextArea1.setText(s); //this not

}

3 个答案:

答案 0 :(得分:3)

我敢打赌,你忽略了在Observer上调用addObserver(),或忽略了调用 setChanged() {{ 1}}在你的Observable中。显示了完整的示例here

答案 1 :(得分:2)

我敢打赌你在GUI线程之外操纵GUI东西。试试这个:

public void update(Observable o, Object arg)
{
    String s = SwimmingCompetition.init().getScoreData().getResults();
    System.out.println(s);
    SwingUtilities.invokeLater(() ->
    {
        jTextArea1.setText(s);
    });
}

答案 2 :(得分:2)

请理解我们的困境。您已经发布了代码并声明它无法正常工作,但是尽管我们要求澄清,但截至目前为止,10小时后,还没有其他代码或说明。所以我们被卡住了。

我们所知道的是:

  • 当Observable的状态发生变化时,你应该调用一个方法update(...)
  • 该方法应该改变GUI的状态,也就是说,它应该改变JTextArea中显示的文本,
  • 但它没有这样做。

如果没有关于我们能做的所有事情的其他信息,那就猜测可能的原因包括:

  • 你正在Swing事件线程上调用长时间运行的代码,冻结你的GUI,这样即使你显示的代码运行正常,Swing事件线程也很忙,它无法绘制GUI和更新文本区域的文本。
  • ...或者由于您的(未示出的)Observable代码中的错误,此更新方法由于某种原因未被调用。
  • ...或者你有多个Observable,而且被更改的那个不是被观察的那个
  • ...或者你有多个Observer对象,被通知的对象与显示的 JTextArea不同。
  • 或者字符串s不包含您认为应该保留的信息。再次根据我的评论,您没有使用更新的参数,并且可能无法在您需要的地方获取正确的信息。

同样,请修正您的问题,以便我们可以回答它而不必做出疯狂的猜测。