1

こんにちは、私が初めて Java プログラミングを始めたとき、私たちのアプリケーションにいくつかのコードがあることに気付きました。別のスレッドからダイアログが作成されていることに気付きましたが、「機能しているように見えた」ので、まぶたを打つことはありませんでした。次に、このメソッドをコードでラップして、ダイアログを表示しました。

これは次のとおりです。

public class DialogModalVisibleThread
        extends Thread {
    private JDialog jDialog;
    public DialogModalVisibleThread(JDialog dialog, String dialogName) {
        this.setName("Set " + dialogName + " Visable");
        jDialog = dialog;
    }

    @Override
    public void run() {
       jDialog.setVisible(true);
       jDialog.requestFocus();
    }
}

使用法:

WarnUserDifferenceDialog dialog = new WarnUserDifferenceDialog( _tableDifferenceCache.size() );
DialogModalVisibleThread dmvt = new DialogModalVisibleThread( dialog, "Warn User About Report Diffs");
dmvt.start();

現在、私が知る限り、swing コンポーネントを別のスレッドから作成したり変更したりしてはいけません。すべての更新は、イベント ディスパッチ スレッドで実行する必要があります。確かにこれは上記のコードに当てはまりますか?

ウィキペディアのEDT

ただし、上記のコードは機能しました。

しかし、最近、無数の再描画の問題が発生しています。たとえば、DialogModalVisibleThread を呼び出してダイアログを表示する JButton をクリックします。クリックされたボタンの横にあるボタンが正しく再描画されませんでした。

再描画の問題は、他の開発者のマシンではなく、私のマシンでより頻繁に発生します。もう 1 人の開発者は、デスクトップを 21 インチ モニターに拡張したラップトップを使用しており、モニターがメイン ディスプレイになっています。彼は Java バージョン 1.6.0_27 で Windows 7 を実行しています。

Windows 7 と Java バージョン 1.6.0_24 を搭載したラップトップで実行しています。デスクトップが両方に拡張された 2 つの追加モニターがあります。

それまでの間、Java 1.6 update 27 にアップグレードします。

上記のコードが再描画の問題を引き起こす可能性があるのか​​ 、それとも関連する描画の問題を抱えている人が他にいるのでしょうか?

これらの問題を診断する簡単な方法はありますか?

ありがとう

4

2 に答える 2

4

つまり、あなたはルールを破っていて、問題を抱えており、ルールを破ったことが原因でこれらの問題が発生するのではないかと考えています。答えはイエスです。ルールを尊重してください!

違反を検出するには、次のページに興味があるかもしれません: http://weblogs.java.net/blog/2006/02/16/debugging-swing-final-summary

于 2012-05-10T10:39:27.987 に答える
2

問題がルール違反によって引き起こされているかどうかを確認する最も簡単な方法は、それらを修正することです (とにかく修正する必要があります :-)

UI を更新するスレッドから SwingWorker.invokeLater() を使用するだけで、Swing の契約に簡単に準拠できます。このような何かがうまくいくはずです:

@Override
public void run() {
    SwingUtilities.invokeLater(new Runnable() {
        jDialog.setVisible(true);
        jDialog.requestFocus();        
        }
    });
}

編集:これを機能させるには、「jDialog」変数を final にする必要があります。

于 2012-05-10T11:45:38.973 に答える