我有一个名为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;
无法发布更多代码,希望这至少有点帮助吗? :/
答案 0 :(得分:8)
这很可能是Swing的并发问题。由于Swing是单线程的,因此需要在Event Dispatch Thread(即EDT)中修改Swing组件。有关详细信息,请参阅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
}