Java Paint 程序绘制形状

标签 java swing jpanel paintcomponent shapes

我的java代码有问题。 我想做一个画家程序,但每当我选择一个形状并绘制它时 之前绘制的所有形状都变得与此形状相同。这是代码。 我知道问题出在 paintComponent 中的 for 语句,但我可以用什么替换它?

class inner extends JPanel implements MouseListener,MouseMotionListener{
        private int oldx,oldy,newx,newy;
        private Point point1,point2;
        private Shape newRec,line1;
        Rectangle currRec;
        private Vector shape;
        private boolean status,status1;
        private int count=0;
        private Object line;
        inner(){
            point1=point2=new Point(0,0);
            shape = new Vector();
            addMouseListener(this);
            addMouseMotionListener(this);
        }

        public void mouseDragged(MouseEvent event) {

            point2=event.getPoint();
            newx = point2.x;
            newy = point2.y;
            if(Universal==7){
            line = new Object(oldx,oldy,newx,newy);
            status = true;
            repaint();
            }


            currRec = new Rectangle(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y));   
            status = true;
            repaint();

        }

        @Override
        public void mouseMoved(MouseEvent arg0) {}
        public void mouseClicked(MouseEvent arg0) {}                
        public void mouseEntered(MouseEvent arg0) {}
        @Override
        public void mouseExited(MouseEvent arg0) {}


        public void mousePressed(MouseEvent event) {

            point1=event.getPoint();
            oldx=event.getX();
            oldy=event.getY();
        }

        @Override
        public void mouseReleased(MouseEvent event) {

            point2=event.getPoint();
            newx=event.getX();
            newy=event.getY();
            //count++;


        if(Universal==7){
                line1 = new Shape(point1.x,point1.y,point2.x,point2.y);
                shape.add(line1);
                //Graphics g = getGraphics();
                //g.setColor(colour);
                //g.drawLine(point1.x,point1.y,point2.x,point2.y);

                count++;
                repaint();
            }
        else if(Universal==1||Universal==2||Universal==3||Universal==4||Universal==5||Universal==6){
                newRec = new Shape(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y));
                shape.add(newRec);
                count++;
                repaint();  
            }
        }

    ///// the problem is in here    
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Shape c;
            g.setColor(colour);
            for(int i=0;i<shape.size();i++){
                c = (Shape) shape.get(i);

            if(Universal==1){

                g.drawRect(c.x, c.y, c.w, c.h);
                if(status){
                    g.drawRect(currRec.x, currRec.y, currRec.width, currRec.height);
                }
            }

            if(Universal==2){
                g.fillRect(c.x, c.y, c.w, c.h);

                if(status){
                    g.fillRect(currRec.x, currRec.y, currRec.width, currRec.height);

                }
            }

            if(Universal==3){
                g.drawRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4);

                if(status){
                    g.drawRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4);

                }
            }

            if(Universal==4){
                g.fillRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4);

                if(status){
                    g.fillRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4);

                }
            }

                if(Universal==5){

                    g.drawOval(c.x, c.y, c.w, c.h);

                    if(status){
                        g.drawOval(currRec.x, currRec.y, currRec.width, currRec.height);
                    }
                }

                if(Universal==6){

                    g.fillOval(c.x, c.y, c.w, c.h);

                    if(status){
                        g.fillOval(currRec.x, currRec.y, currRec.width, currRec.height);
                    }
                }

                if(Universal==7){

                    g.drawLine(c.x, c.y, c.w, c.h);

                    if(status){
                        g.drawLine(line1.x, line1.y, line1.w,line1.h);
                    }
                }

                if(Universal==8){
                    shape.clear();
                }
            }
        }

最佳答案

Universal 只会在任何给定时间成为给定值。

油漆不是累积性的,而是具有破坏性的。

也就是说,每次调用 paintComponent 时,所有以前的内容都会被删除/删除干净,并且您需要“重新绘制”内容。

您不应依赖单个标志,而应将 Shape 添加到某种 List 中,并在 paintComponent 时重新绘制它们。叫做。同样,您可以简单地将“类型”(int) 添加到 List 并在每次重绘时处理该列表

看看Painting in AWT in Swing油漆过程的解释

关于Java Paint 程序绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426823/

相关文章:

java - 我如何剖析或分析这个正则表达式?

java - 哈希表中自定义键的实现

java - 如何在 Android 上建立异步 URL 连接?

java - 修复 JList 的最大大小并更改空单元格的外观

java - 为什么jPanel不清除?

java - Jackson JSON 处理器 : SerializationConfig. Feature.USE_ANNOTATIONS 设置为 false

java- 为什么我在使用 gui 创建 ATM 时收到 "class is not abstract and does not override abstract method"?

java - 查看窗口是否失去焦点

java - 将 JPanel 调整为正确的大小

java - 在 JPanel 上使用 slider 绘制二次公式