重新打印而不清除
问题描述:
我正在研究一个模仿Paint的程序。问题是当我绘制一个新形状时,先前的形状被删除。我试图评论出我的paintComponents的超级调用,它可以工作,但留下了太多的绘图。重新打印而不清除
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Canvas1 extends JPanel{
Circle c;
Rectangle r;
Line l;
String str;
int x1,x2,y1,y2;
Graphics g;
int draw;
int hollow=0;
Color cc;
public Canvas1(){
LineListener listener = new LineListener();
addMouseListener(listener);
addMouseMotionListener(listener);
setBackground (Color.white);
setPreferredSize (new Dimension(400, 400));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(cc);
if (this.draw == 1)
{
c = new Circle (x1,y1,x2,y2);
if (hollow == 0)
{
c.hollow = false;
}
if (hollow == 1)
{
c.hollow = true;
}
c.draw(g);
}
if (this.draw ==2)
{
r = new Rectangle (x1,y1,x2,y2);
if (hollow == 0)
{
r.hollow = false;
}
if (hollow == 1)
{
r.hollow = true;
}
r.draw(g);
}
if (this.draw ==0)
{
l = new Line(x1,y1,x2,y2);
l.draw(g);
}
if (this.draw ==3)
{
g.drawString(str, x1, y1);
}
}
public void update(Graphics g) {
paint(g);
}
private class LineListener implements MouseListener, MouseMotionListener{
public void mousePressed(MouseEvent event){
x1 = event.getX();
y1 = event.getY();
if (draw ==3)
{
str = JOptionPane.showInputDialog("Enter String");
repaint();
}
}
public void mouseDragged(MouseEvent event){
if (draw ==1 || draw==2)
{
x2 = event.getX()-x1;
y2 = event.getY()-y1;
}
if (draw ==0)
{
x2 = event.getX();
y2 = event.getY();
}
repaint();
}
public void mouseClicked (MouseEvent event) {
}
public void mouseReleased (MouseEvent event) {
if (draw ==1 || draw==2)
{
x2 = event.getX()-x1;
y2 = event.getY()-y1;
}
if (draw ==0)
{
x2 = event.getX();
y2 = event.getY();
}
}
public void mouseEntered (MouseEvent event) {}
public void mouseExited (MouseEvent event) {}
public void mouseMoved (MouseEvent event) {}
}
}
答
正如你已经发现,你需要调用super.paintComponent(g)
,否则,JPanel
背景没有得到画,一切是一个烂摊子。问题是任何时候只能绘制一个形状,因为draw
字段只能是单个值。一种解决方案是创建一个形状为ArrayList
的图形,并在paintComponent
的List
中绘制每个图形。
谢谢,这有帮助。不能upvote – user1965206 2013-03-25 18:51:04