【问题标题】:Java: Calling static method but nothing happens?Java:调用静态方法但没有任何反应?
【发布时间】:2024-05-01 10:05:01
【问题描述】:

我有一个名为 GUI 的类,它基本上使用 Swing 创建了一个 latout。在那个类中,我有一个名为“log”的方法,它应该在布局中的 textarea 中添加一个新行。

问题是,每当我从 GUI 类外部调用该函数时,什么都没有发生。如果我从类中调用该方法,它会在 textarea 中添加一行,就像它应该做的那样。

我已将方法及其调用的所有变量设置为 public static,我没有收到任何错误。当我从外部调用该方法时,它什么也不做。

有什么想法吗?

编辑:

这是 GUI 类中的方法:

public static void log(String inputString) {
    logConsole.append(inputString + "\r\n");
}

在swing类的底部声明了textarea,我只是将它修改为public static而不是private。

public static javax.swing.JTextArea logConsole;

无法发布更多代码,希望这至少有点帮助? :/

【问题讨论】:

  • 我把水晶球忘在家里了。
  • 如果不粘贴相关代码将很难回答。但是您可以尝试通过编写 Class.theMethod() 从外部类调用该方法
  • 我的车坏了。它有什么问题?
  • 伙计们,缓和敌意……天哪。 @qwerty,为了尽快获得更好的帮助,请包含sscce
  • 我仍然没有看到足够的代码来解释您的问题。如果 mre 在下面的回答中的出色建议无济于事,我会支持 SSCCE 的建议。顺便说一句,关于“提供代码”,我们不想看到整个程序,只是对重现您的问题的程序进行的一个小的可编译编辑。查看上面mre评论中的链接,了解这涉及的详细信息。如果您可以制作并发布一个好的帖子,您通常会在这里很快得到一个好的答案。由你决定。

标签: java swing methods static


【解决方案1】:

这很可能是 Swing 的并发问题。由于 Swing 是单线程的,因此 Swing 组件需要在 Event Dispatch Thread(即 EDT)中进行修改。如需更多信息,请参阅Concurrency in Swing


编辑 -

如果这确实是一个并发问题,那么一种快速的解决方法是使用SwingUtilities。特别是isEventDispatchThread()invokeLater(...)。例如,

if(!SwingUtilities.isEventDispatchThread()){
    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run(){
            GUI.log("foo"); // modify textarea in EDT
        }
    });
}
else{
    // your problem lies elsewhere
}

【讨论】:

  • 进一步解释:一行被附加到logConsole。问题是这个变量在你的 cpu 上每个核心的缓存上都有副本。您正在主线程(一个核心)上写入logConsole 的一份副本,但不幸的是,屏幕上显示的副本是 Swing EDT(另一个核心)中包含的副本。
  • 是的,我似乎无法让它工作,我阅读了 mre 发布的文档,但我不太明白 atm。有没有一种简单的方法可以让它工作?
  • 我发现我已经有了那个代码,除了我的没有@Override 行,所以我添加了它。我的也没有 if 状态包装它但是当我尝试添加它时给我一个“非法类型开始”错误......(我已经导入了 SwingUtilities 库)但我不确定这是否是错误,因为它现在应该可以工作了吗?
  • @qwerty,您收到的错误的解释让我有点困惑,因为我提供的代码 sn-p 不会产生这样的错误。我当然认为你遇到了线程问题,我提供的代码 sn-p 应该可以解决这个问题。如果没有,那么正如我的评论所说,你的问题出在其他地方
  • 完整的错误在这里:link。我也认为这是一个与线程相关的问题,因为我之前遇到过一些问题,但没有这样的问题。这很奇怪,因为它没有给我任何错误,它只是忽略了方法调用,有点。