1

JPanel 内に含まれる JButton の 2D 配列で構成される 4 フレームのベクターがあります。これらを JFrame に追加して、ループ時にアニメーションを表示しようとしています。

手動でインクリメントすると機能する add メソッドがありますが、for ループに入れると、フレームが再描画されていないかのように空白のままになります。端末は正しいインデックス番号を表示します。

public void addNewFrame() throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        if (index == 3) {
            System.out.println(index);
            remove(model.getFrame(3));
            revalidate();
            repaint();
            index = 0;
            add(model.getFrame(index), BorderLayout.CENTER);
            revalidate();
            repaint();
            Thread.sleep(300);
        } else {
            System.out.println(index);
            remove(model.getFrame(index));
            revalidate();
            repaint();
            index++;
            add(model.getFrame(index), BorderLayout.CENTER);
            revalidate();
            repaint();
            Thread.sleep(300);
        }
    }

これは同時実行の問題でしょうか? 独自のスレッドで実行されている JPannel にボタンの 2D 配列を追加する必要がありますか?

4

2 に答える 2

0

if ステートメントで同じ操作を実行しているため、そのアクションの更新がかなり難しくなります。それが本当に必要な機能である場合は、次のように変更する必要があります。

for (int i = 0; i < 10; i++) {
    boolean resetIndex = false;
    remove(model.getFrame(index));
    if (index == 3) {
        index = 0;
        resetIndex = true;
    }
    System.out.println(index);
    remove(model.getFrame(index));
    revalidate();
    repaint();
    if (!resetIndex && index != 3)
        index++;
    add(model.getFrame(index), BorderLayout.CENTER);
    revalidate();
    repaint();
    Thread.sleep(300);
}

また、現在のペイント自体を指示するだけとは異なり、すべての子の呼び出しを適切に処理するrevalidateandrepaint呼び出しを置き換えることも検討する必要があります。updateUIrepaintJComponent

于 2013-04-18T19:59:15.480 に答える