0

我在使用 SWING GUI 时遇到问题,或者至少我认为这是 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 秒,有时会持续几分钟。但它总是最终会回来并响应新的输入(即它不记得我在它回来之前所做的所有点击)。整个应用程序很简单,因为它一直等到用户做某事后再做某事,所以我对为什么它似乎挂起感到困惑。

任何帮助,将不胜感激。

谢谢

4

1 回答 1

1

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

为了制作响应式 UI,您必须在 10-100 毫秒(视觉上几乎是瞬间)内看到控制台上出现的第一条和最后一条语句。如果你真的想变得花哨,你可以在停止和底部使用 System.currentTimeMillis() 。减去这两个值并 println() 它。这将准确地告诉您该侦听器运行了多长时间。如果它大于 100 毫秒,则需要通过改进算法或在线程上卸载长计算来重组代码(请参阅此SwingWorker 教程)。

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 );
}
于 2012-11-28T16:27:12.043 回答