0

SWING GUIに問題があります。少なくとも、SwingGUIだと思います。

これが私のメインコードファイルです:

/**
 * 
 */
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 のルール 1 は、ActionListener の実行中に UI を再描画できないことです。

応答性の高い UI を作成するには、最初と最後のステートメントが 10 ~ 100 ミリ秒以内 (視覚的にはほぼ瞬時) にコンソールに表示されるのを確認する必要があります。本当に凝りたい場合は、ストップとボトムで System.currentTimeMillis() を使用できます。2 つの値を減算し、それを 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 に答える