2012-11-28 124 views
0

我遇到了SWING GUI的问题,或者至少我认为它是swing gui。JAVA Swing Gui窗口挂起

这里是我主要的代码文件:

/** 
* 
*/ 
package com.tda.t2.ctas.slasher; 

import javax.swing.SwingUtilities; 

import com.tda.t2.ctas.slasher.gui.mainFrame; 
import com.tda.t2.ctas.slasher.utils.MyCloseListener; 



public class SLASHer { 

    public SLASHer() { 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     //EventQueue.invokeLater(new Runnable() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       ConfigData myconfig = new ConfigData(); 
       try { 
        //TdaUrlHelper window = new TdaUrlHelper(); 
        //window.tdaFrame.setVisible(true); 
        mainFrame tdaFrame = new mainFrame(); 
        tdaFrame.setVisible(true); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

简单的调用来创建框架并打开它。还有其他文件,我没有放在这里的空间。但是我拥有的问题(以及我在几台机器和操作系统上尝试的)是,窗口上的按钮似乎挂起。我可以选择窗口并点击按钮,并突出显示它们被击中但没有任何反应。我有一个标签平面,点击其他标签也什么也不做。有时这最后约15秒,其他时间持续几分钟。但它总是会回来,并会响应新的输入(即它不记得我在回来之前所做的所有点击)。整个应用程序很简单,因为它在等待用户做某事之前做了某些事情,所以我很困惑它为什么似乎挂起。

任何帮助,将不胜感激。

感谢

+2

你的问题是代码未显示。可能你并没有在JButton的ActionListeners中很可能遵守Swing线程规则,但是谁知道直到我们看到有问题的代码。 –

+0

听起来像是GUI线程正在打印堆栈跟踪(:\),或者您有多线程错误。 –

+2

请注意,mainFrame类应该重命名为MainFrame。所有类名都应以大写字母开头。如果您希望其他人(如我们)能够理解您的代码并为您提供帮助,这一点非常重要。 –

回答

1

什么是有问题的代码附加到挂机按钮?检查控制台是否有异常,并在该代码的顶部和底部放置一些System.out.println()语句。看看你是否看到这些打印语句打印出来。观察顶部打印和底部打印需要多长时间。如果你看到两个语句,那么你知道整个模块正在执行,但是如果需要一段时间才能显示最后一条语句,那么你知道你正在挂起Swing线程(也称为EDT - 事件分派线程)。 Swing UI中的规则1在执行ActionListener时不能重绘。

为了制作响应式用户界面,您必须在10-100毫秒内(视觉上几乎是瞬间的)在控制台上看到第一个和最后一个语句。如果你真的想要看起来可以在停止和底部使用System.currentTimeMillis()。减去两个值并println()它。那会告诉你这个听众跑了多久。如果它大于100ms,则需要通过改进算法或在线程中加载长计算来重构代码(请参阅此SwingWorker tutorial)。

public void actionPerformed(ActionEvent event) { 
    System.out.println("Starting SomeProcess"); 
    long start = System.currentTimeMillis(); 

    // all your code belongs here 

    long duration = System.currentTimeMillis() - start; 
    System.out.printf("SomeProcess took %,d ms%n", duration); 
} 
+0

我没有添加按钮代码,因为面板上共有81个按钮。在这一点上,我点击的按钮并不重要。挂起时,所有的按钮都不起作用,直到弹出为止。它几乎像它没有意识到它现在已经关注这就是为什么我发布了我所做的。 –

+1

那么这取决于你需要多少帮助。您可以按照我的建议进行操作,并自行找出问题的具体细节,或者只是发布其中一个挂起UI的按钮的代码。你是对的我不打算通过81个按钮的听众,但我会看看1个按钮的听众。我想如果你按照我的建议行事,你就会知道问题是什么。如果你不能找出更多的代码。 – chubbsondubs

+0

我同意。由于某种原因@JesterHawk似乎不想发布任何监听器代码。直到他做,我们所能做的只是想知道发生了什么。可能只有一个听众就足够了。 –