マウスでクリックするところに黒い楕円を描く簡単なプログラムを作成しています。ただし、新しい楕円を表示し、古い楕円を非表示にします。どうすればこれを行うことができますか? 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) {
}
}
すぐに解決できるのは、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();
}
_
JPanelはJComponentのサブクラスであるため、paintComponent
の代わりにPaint
をオーバーライドする必要があります。また、 paintComponent
でsuper.paintComponent(g)
を使用する必要があります。方法。
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
removeAll
を使用すると、JPanelのすべてのコンポーネント(ボタン、テキストフィールド、ラベルなど)が削除されます(存在する場合)。ただし、JPanelにコンポーネントを追加していないようであるため、このメソッドを呼び出す必要はありません。
新しく作成された楕円を表示したいだけの場合の1つの可能な回避策。フレームとパネルを静的にしてから、mousePressedでframe.setContentPane(panel)を呼び出します。
もう1つの作業メソッドは、Paintでg.clearRect(0、0、getWidth()、getHeight())を呼び出すことですが、これにより背景全体が白色になります。
現在の描画面の背景色でfillOvalを入力するだけです
{
g.setColor(...);//setColor to surface background
g.fillOval(x, y, 50, 50);
}
必要に応じて、領域をクリアできます:more at OracleDoc