【问题标题】:Why GUI not updating in Observer pattern?为什么 GUI 不以观察者模式更新?
【发布时间】:2016-02-01 11:49:41
【问题描述】:

我有 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

}

【问题讨论】:

  • 我们无法根据您发布的内容来判断问题所在。猜测包括——你可能会占用 Swing 事件调度线程,如果你这样做,GUI 将完全不响应用户交互,你可能会通过创建多个实例来隐藏 GUI,并更改非可视化实例,...您将需要发布更多相关代码....多少?很难说,但不能太多也不能太少! ;) 最好是minimal reproducible example
  • 与您的问题无关,但我很好奇您为什么不在 update(...) 方法中使用 arg 参数?另外,您为什么要调用 SwingCompetition 的静态方法,更不用说 init() 类型的方法?这让我对你的整体程序设计感到担忧。
  • 在您更新/改进您的问题后,请在评论中使用@Hovercraft 回复我。谢谢。

标签: java swing observer-pattern


【解决方案1】:

请理解我们的困境。您已发布代码并声明它无法正常工作,但尽管我们要求澄清,但截至目前,10 小时后,没有额外的代码或澄清即将到来。所以我们被困住了。

我们所知道的是:

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

如果没有额外的信息,我们所能做的就是猜测。可能的原因包括:

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

再次,请修正您的问题,以便我们可以回答,而不必做出疯狂且可能不正确的猜测。

【讨论】:

【解决方案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);
    });
}

【讨论】:

  • 虽然你的建议很好,但我敢打赌这不是问题的原因。
  • @HovercraftFullOfEels:因为Observable 可能“在不同的线程上发送通知”,我会说这很有用。
  • @trashgod:我同意,并且没有对此投反对票。但我打赌它仍然无法解释问题的原因,因为调用线程通常会间歇性地工作,当它失败时,通常会抛出一些异常。然而,原始发布者的问题仍然非常不完整,迫使我们所有人猜测。
【解决方案3】:

我敢打赌,您忽略了在您的 Observer 上调用 addObserver(),或者忽略在您的 Observable 中调用 both setChanged() notifyObservers() .一个完整的例子显示在here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2012-07-22
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多