1

我正在开发一个模仿 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) {}
    }
}
4

2 回答 2

2

自定义绘画方法展示了解决此问题的两种常见解决方案。

一种是从列表中提取。另一种是从 BufferedImage 中绘制。

于 2013-03-25T17:57:03.110 回答
2

正如您所发现的,您需要调用super.paintComponent(g),否则,JPanel背景不会被绘制,一切都是一团糟。问题是任何时候都只能绘制一个形状,因为该draw字段只能是一个值。一种解决方案是创建一个ArrayList形状并在Listin 中绘制每个形状paintComponent

于 2013-03-25T17:50:26.437 回答