3

私はJavaでグラフィックスを始めたばかりで、問題があります。JPanel パネルを使用して JFrame ウィンドウ (NetBeans Designer) を作成し、そこにいくつかのグラフィックを描画しました。次に、JPanel 上の正方形の X 位置を変更する変数を変更する JButton を追加しました。

ボタンを押すと、次のコードが実行されます。

drawObject.setX(150);
drawObject.repaint();

drawObject はこのクラスのインスタンスです:

public class sola extends JPanel {

    private int x = 10;

    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        super.setBackground(Color.WHITE);

        g.setColor(Color.ORANGE);
        g.fill3DRect(x, 160, 100, 50, true);
    }

    public void setX(int xX){
        x = xX;
    }
}

ここで、JButton を押すと、長方形は新しい位置に移動しますが、古い位置にまだ表示されています。ウィンドウのサイズを変更したときにのみ、ウィンドウが更新され、古い長方形が消えます。この問題を解決するにはどうすればよいですか? ボタンを押すと、長方形は新しい位置にのみ表示されますか?

4

3 に答える 3

3

これは

super.paintComponent(g);

いいえ

super.paintComponents(g);  // note the s at the edn

両者の大きな違い!最初のものは、JPanel に、背景 (プロジェクトのキー) の再描画を含め、paintComponent メソッドによって通常実行されるすべてのハウスキーピング機能を実行するように指示します。2 つ目は、呼び出しが上記の機能のいずれも実行しないものです。したがって、私のアドバイスは、スーパー コールの末尾の s を削除することです。

于 2011-03-13T12:11:26.250 に答える
1

repaint()メソッドを使用してこれを行うことができます。

パネルで paintComponent() を使用する場合。私見は、パネル全体の絵の世話をする必要があります。あなたの例には、古いペイントされた長方形の削除を処理するコードはありません。

私がお勧めするのは、長方形用の独自のコンポーネントを作成することです。(コンポーネントから拡張できます)その後paintComponent、パネルで行ったように、これらのクラスのメソッドをオーバーライドできます。Panel はコンテナ コンポーネントとして機能する必要があるためです。長方形自体を描くのではありません。

これらのコンポーネントのインスタンスを通常の JPanel に追加することを知っています。その後、これは期待どおりに更新されます。

于 2011-03-13T12:12:55.893 に答える
1

JComponent から次のメソッドを使用できます: ( http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html )

void    repaint(long tm, int x, int y, int width, int height)
 Adds the specified region to the dirty region list if the component is showing.
void    repaint(Rectangle r)
 Adds the specified region to the dirty region list if the component is showing.

あなたは前にそれらを呼び出すことができますredraw()

于 2011-03-13T12:09:48.843 に答える