1

ランダムな形状とランダムなテキストを表示するプログラムを構築しようとしています。これは、JPanel を拡張するクラス内のコードです。

@Override
protected void paintComponent(Graphics g) { 
    // draw all shapes        
    super.paintComponent(g);     // clears the background       

    this.add(new JLabel(new RandomText().getRandomSentence()));
    for (RandomShape shape : shapes) {
       shape.draw(g);
    }         
}

g.drawString() の代わりに JPanel を使用して、将来 HTML コードを表示します。repaint() メソッドを呼び出して、ウィンドウを「再生成」するボタンもあります。ただし、再生成ボタンを押して repaint() メソッドを呼び出すと、形状は (想定どおりに) 変更されますが、テキストは変更されません。さらに奇妙なのは、ウィンドウのサイズを変更すると、新しいラベルがパネルに継続的に追加されることです (本来のようにランダムなテキストで)。

super.paintCompnent(g) は、パネルに追加されたコンポーネントをクリアしませんか? もしそうなら、自分で repaint() を呼び出しても、ウィンドウのサイズ変更のように余分なラベルが追加されないのはなぜですか?

4

4 に答える 4

2

ウィンドウのサイズを変更すると、強制validate()的に呼び出され、パネル上にコンポーネントが再レイアウトされます。単純に再描画するだけではできません。

ただし、ペイント方法では、毎回新しい JLabel を追加し、削除することはありません。これは、ほとんどの場合、やりたいことではありません。別の変数で JLabel を追跡し、(できれば) 再描画するときにその位置を変更するか、新しい変数を追加する前に削除する必要があります。

于 2013-10-07T12:55:18.380 に答える