web-dev-qa-db-ja.com

Java-JPanelからグラフィックをクリアする方法

マウスでクリックするところに黒い楕円を描く簡単なプログラムを作成しています。ただし、新しい楕円を表示し、古い楕円を非表示にします。どうすればこれを行うことができますか? mousePressedメソッドに挿入されたremoveAll()メソッドをいじりましたが、機能しません。 removeAll()メソッドはこれにも適していますか?それとも私は何か他のものを使うべきですか?答えが明らかな場合は申し訳ありませんが、私はまだこれに慣れておらず、学ぼうとしています。どんなアドバイスでも大歓迎です。ありがとう。

import Java.awt.Color;
import Java.awt.Graphics;
import Java.awt.event.MouseEvent;
import Java.awt.event.MouseListener;
import Java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintPractice extends JPanel implements MouseListener {

    Random Rand = new Random(); 
    int x = Rand.nextInt(450);
    int y = Rand.nextInt(450);

    public PaintPractice(){
        super();
        addMouseListener(this);
    }

    public static void main(String[] args){

        JFrame frame = new JFrame();
        PaintPractice panel = new PaintPractice();

        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);        
    }

    public void Paint(Graphics g){
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 50, 50);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        removeAll();
        repaint();      
    }

    @Override
    public void mouseClicked(MouseEvent e) {        
    }

    @Override
    public void mouseEntered(MouseEvent e) {        
    }

    @Override
    public void mouseExited(MouseEvent e) {     
    }

    @Override
    public void mouseReleased(MouseEvent e) {       
    }
}
5
anonymous noob

すぐに解決できるのは、super.Paint(g)メソッドでPaint(Graphics g)を呼び出すだけです。

_public void Paint(Graphics g){
        super.Paint(g);
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 50, 50);
    }
_

ペイントメカニズムと、paintComponent()をオーバーライドする代わりにPaint()をオーバーライドする必要がある理由:

Javadocの説明 ペイントメカニズム

これで、paintComponentメソッドがすべてのペイントコードを配置する場所であることがわかりました。このメソッドはPaintの時間になると呼び出されるのは事実ですが、実際には、Paintメソッド(Java.awt.Componentで定義)を使用して、クラス階層の上位でペイントが開始されます。このメソッドは、Paintサブシステムによって常に実行されます。コンポーネントをレンダリングする必要があります。その署名は次のとおりです。

  • public void Paint(Graphics g)

javax.swing.JComponentはこのクラスを拡張し、Paintメソッドを次の順序で呼び出される3つの別々のメソッドにさらに分解します。

  • 保護されたvoidpaintComponent(Graphics g)
  • 保護されたvoidpaintBorder(Graphics g)
  • 保護されたvoidpaintChildren(グラフィックスg)

APIは、コードがpaintBorderとpaintChildrenをオーバーライドするのを防ぐために何もしませんが、一般的に言って、そうする理由はありません。すべての実用的な目的で、paintComponentはオーバーライドする必要がある唯一のメソッドになります

これが、PaintPracticeコードが代わりにsuper.paintComponent(g)を呼び出す必要がある理由です。

_public void paintComponent(Graphics g) {    
    super.paintComponent(g);       
     g.setColor(Color.BLACK);
     g.fillOval(x, y, 50, 50);
}  
_

また、removeAll()メソッドでmousePressed(MouseEvent e)を呼び出す必要はありません。

_    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        repaint();     
    }
_
3
MChaker
  1. JPanelはJComponentのサブクラスであるため、paintComponentの代わりにPaintをオーバーライドする必要があります。また、 paintComponentsuper.paintComponent(g) を使用する必要があります。方法。

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    
  2. removeAll を使用すると、JPanelのすべてのコンポーネント(ボタン、テキストフィールド、ラベルなど)が削除されます(存在する場合)。ただし、JPanelにコンポーネントを追加していないようであるため、このメソッドを呼び出す必要はありません。

3
TNT

新しく作成された楕円を表示したいだけの場合の1つの可能な回避策。フレームとパネルを静的にしてから、mousePressedでframe.setContentPane(panel)を呼び出します。

もう1つの作業メソッドは、Paintでg.clearRect(0、0、getWidth()、getHeight())を呼び出すことですが、これにより背景全体が白色になります。

3
HiroshiFuu

現在の描画面の背景色でfillOvalを入力するだけです

 {
        g.setColor(...);//setColor to  surface background 
        g.fillOval(x, y, 50, 50);
    }

必要に応じて、領域をクリアできます:more at OracleDoc

1
Tirupati Rao