根據描述,我假設你想要類似「一個簡單的繪圖程序」。
調用super.paintComponent(g)
作爲重寫的paintComponent
的第一行是正確的。這確實會擦除背景(即之前繪製的所有內容都將被刪除)。
在Swing中,一切,你要畫已經在paintComponent
方法塗(或在從那裏叫,並接收相同Graphics
對象的任何方法)。
如果你想「拯救」你有畫的一切,你必須一切畫成圖像(即進入一個BufferedImage
),並在paintComponent
方法繪製此圖像。 (!)
沒有與代碼中的一些其他問題,但沒有改變太多剩餘的代碼,這可能大致可以達到這樣的:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
class OraclePaint extends JFrame {
public static void main(String[] args) {
OraclePaint ss = new OraclePaint();
ss.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ss.add(new MyPanel());
ss.setSize(250, 200);
ss.setVisible(true);
}
}
class MyPanel extends JPanel {
private BufferedImage image = null;
public MyPanel() {
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent event) {
if (image != null) {
// Paint into the image
Graphics g = image.getGraphics();
g.setColor(Color.BLACK);
g.fillOval(event.getX(), event.getY(), 22, 22);
g.dispose();
repaint();
}
}
}); // end call to addMouseMotionListener
}
// Make sure that the image is not 'null' and that
// it has the same size as this panel
private void validateImage()
{
if (image == null)
{
image = new BufferedImage(getWidth(), getHeight(),
BufferedImage.TYPE_INT_ARGB);
}
if (image.getWidth() != getWidth() || image.getHeight() != getHeight())
{
BufferedImage newImage = new BufferedImage(getWidth(), getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
image = newImage;
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
validateImage();
g.drawImage(image, 0, 0, null);
}
}
嘗試使用'x'和'y'座標正值。 – Omoro
謝謝,但它沒有奏效。 –
它會移動它,因爲每次拖動鼠標時都會要求它繪製它。當然你不想鼠標點擊? – arynaq