Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么GUI不以观察者模式更新?_Java_Swing_Observer Pattern - Fatal编程技术网

Java 为什么GUI不以观察者模式更新?

Java 为什么GUI不以观察者模式更新?,java,swing,observer-pattern,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.se

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

}

我打赌您正在GUI线程之外操作GUI内容。试试这个:

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

我打赌您忽略了在中调用
addObserver()
,或者忽略了在中调用
setChanged()
notifyobserver()
。这里展示了一个完整的例子。

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

我们知道的是:

  • 您有一个方法,
    update(…)
    ,应该在可观察对象的状态发生更改时调用该方法
  • 这个方法应该改变GUI的状态,也就是说,它应该改变JTextArea中显示的文本
  • 但它并没有这样做
如果没有更多的信息,我们所能做的就是猜测。可能的原因包括:

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

同样,请修正您的问题,这样我们就可以回答您的问题,而不必胡乱猜测,也不必做出可能不正确的猜测。

我们无法根据您发布的内容判断出问题所在。猜测包括--您可能正在占用Swing事件调度线程,如果您这样做,GUI将对用户交互完全没有响应,您可能正在通过创建多个实例来跟踪GUI,并更改非可视化实例,。。。您需要发布更相关的代码。。。。多少钱?很难说,但不要太多也不要太少!;)最好是一个.与您的问题无关,但我很好奇为什么您不在
update(…)
方法中使用
arg
参数?还有,为什么要调用SwingCompetition的静态方法,更不用说
init()
type方法了?这让我对你的整体程序设计感到担忧。在你更新/改进你的问题后,请在评论中用
@Hovercraft
回复我。谢谢。虽然你的建议很好,但我敢打赌这不是问题的原因。@HovercraftFullOfEels:因为
Observable
可能“在不同的线程上发送通知”,我会说这很有用。@trashgod:我同意,并且没有否决这一点。但我打赌它仍然不能解释问题的原因,因为调用线程通常会间歇性地工作,当它失败时,通常会抛出一些异常。然而,原始海报的问题仍然令人遗憾地不完整,迫使我们大家猜测。在遇到了这些问题中的很大一部分之后,我衷心地支持一种解决问题的方法。