1

JInternalFrame を拡張する GameUpdater という Java クラスがあります。クラスを単独でプログラムとして実行したときは JFrame を拡張していましたが、より大きなアプリケーションの一部にするために JInternalFrame に変更し、メニュー ボタンからアクセスできるようになりました。

このメニューボタンを押したときに呼び出される関数は次のとおりです。

private void update(){

    GameUpdater gu = new GameUpdater();
    desktop.add(gu); //add to JDesktopPane
    gu.setSize(400, 300);
    gu.setVisible(true);

    gu.readMatches();//this function takes ages

    gu.setMatch("Updating database...");//this is some output to the user, displays info in the internal frame
    //try and insert into database
    for(Match m : gu.getMatches()){
        db.insertMatch(m);
    }
    gu.setMatch("DONE"); //now it shows the frame, way too late
}

メソッド gu.readMatches() は実行に時間がかかるため、定期的に JInternalFrame のコンテンツを更新して進行状況を表示します。ただし、この更新機能が完了するまでフレームは表示されません。

setVisible(true) が関数の最後まで待っているようなものです...

JFrame の場合は問題なく動作しました。これを引き起こす JInternalFrame の奇妙なプロパティはありますか?

乾杯

4

2 に答える 2

2

イベント ディスパッチ スレッド(EDT)内で時間のかかるプロセスを実行しているようです。これにより、イベント キューが (とりわけ) 再描画要求を処理できなくなります。

これにより、プログラムが「ハング」したように見えます。

このタスクをバックグラウンド スレッドにオフロードする必要があります。

Concurrency in Swing、特にWorker Threads と SwingWorkerのセクションを読んでください。

于 2012-09-17T19:39:37.737 に答える
2

問題は、 EDTをブロックしていることです。これは、メソッドを呼び出す新しいThread/ Runnablethar を作成するだけで対処できます。gu.readMatches();

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
gu.readMatches(); //gu will have to be declared `final`

gu.setMatch("Updating database...");//this is some output to the user, displays info in the internal frame
//try and insert into database
for(Match m : gu.getMatches()){
    db.insertMatch(m);
}
}
});

もちろん、ユーザーが読み取り値JProgressBarの距離を追跡できるように を実装することもできます。

于 2012-09-17T19:40:25.283 に答える