3

ここに画像の説明を入力

そのため、ユーザーがパネルを追加または削除できる GUI を作成しています。それをシミュレートするためTimerTaskに、ターゲットの名前とJPanelを含む親を取る を作成しましたJPanel
0 までカウントダウンした後、親から を削除し、親と祖父母 JPanelを呼び出します。repaint()

古いパネルは削除されますが、親に含まれる他のコンポーネントは代わりに表示されません。図では、スクロール バーがまだ 2 つのコンポーネントを示していることがわかります。

スクロール バーを手動で下にドラッグして変更を確認する必要があります。そのとき、下のコンポーネントが表示されます。

なぜこうなった?

コンポーネントをネストする方法は次のとおりです。

JScrollPane (grandparent)
|
|-> JPanel (parent)
    |
    |-> JPanel (target)  

XMLファイルからのデータが取り込まれ、JAXBを使用しているため、SSCCEは不可能JPanelsです..不可能です:(しかし、ここにからのスニペットがありますTimerTask

import java.util.TimerTask;
import javax.swing.*;

public class RemoverTask extends TimerTask{
    StudentPanel s;
    JPanel h;
    JScrollPane p;
    public RemoverTask(StudentPanel s,JPanel holder,JScrollPane pane){
        this.s = s;
        h = holder;
        p = pane;
    }

    @Override
    public void run(){
        long x = Integer.MAX_VALUE/2;
        JFrame frame = new JFrame("Counter");
        JTextArea area = new JTextArea();
        JScrollPane pane = new JScrollPane(area);
        pane.setPreferredSize(new java.awt.Dimension(350, 350));
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        while(x > 100){
            x =  x - 1500;
            area.append("Value of X: " + x + "\n");
        }
        if(!frame.isVisible()){
            frame.dispose();
        }
        h.remove(s);
        h.repaint();
        pane.repaint();
    }
}
4

1 に答える 1

3

You can still make an sscce, just don't worry about the xml data etc. Simplify the problem, man. Also, don't use a java.util.Timer with a Swing app but rather a javax.swing.Timer, a Swing Timer. Else you will be making Swing changes off of the Swing EDT which is dangerous.

A problem: you never call revalidate() on the container. You would usually call revalidate() before calling repaint() on the container when making changes to it. The revalidate tells the layout managers to layout their components which is necessary to change the GUI.

于 2013-05-18T18:36:08.483 に答える