2011-09-06 181 views
0

我有一个名为GUI的类,它基本上使用Swing创建一个latout。在那个类中,我有一个名为“log”的方法,它应该在布局中为textarea添加一个新行。Java:调用静态方法但没有任何反应?

问题是,每当我从GUI类以外调用函数时,什么都不会发生。如果我从该类中调用该方法,则会向textarea添加一行,正如它应该做的那样。

我已经设置了方法及其调用public static的所有变量,并且我没有收到任何错误。当我从外部调用该方法时,它不会做任何事情。

任何想法?

编辑:

这里的GUI类中的方法:

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

在类挥杆最底宣布textarea的,我只是修改了它是公共静态的,而不是私人的。

public static javax.swing.JTextArea logConsole; 

不能发布更多的代码,希望这至少有点帮助吗? :/

+1

你能发布你的代码吗? –

+1

我把我的水晶球留在家中。 –

+0

如果不粘贴相关代码,将很难回答。但是你可以尝试通过编写Class.theMethod() –

回答

8

这很可能是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 
} 
+1

进一步解释:一条线正被追加到'logConsole'。问题是这个变量在你的cpu上的每个核心的缓存上都有副本。您正在主线程(一个核心)上写入'logConsole'的一个副本,但不幸的是,屏幕上显示的副本是包含在Swing EDT(另一个核心)中的副本。 – toto2

+0

是的,我似乎无法得到它的工作,我读了文件mre张贴,但我不完全得到atm。有没有简单的方法来使这个工作? – qwerty

+0

@qwerty,请参阅编辑。 – mre