Java 鼠标拖动和绘制

Java 鼠标拖动和绘制,java,shapes,Java,Shapes,我无法显示所有三角形。我用鼠标拖动画了一个三角形。每次我画一个新的三角形,以前的三角形就消失了。如何使三角形保持不变,使绘图面板上有许多三角形 ..... private class PaintSurface extends JComponent { Point startDrag, endDrag, midPoint; Polygon triangle; public PaintSurface() { this.addMouseListener(new Mouse

我无法显示所有三角形。我用鼠标拖动画了一个三角形。每次我画一个新的三角形,以前的三角形就消失了。如何使三角形保持不变,使绘图面板上有许多三角形

.....
private class PaintSurface extends JComponent {
   Point startDrag, endDrag, midPoint;
   Polygon triangle;
   public PaintSurface() {
      this.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
         startDrag = new Point(e.getX(), e.getY());
         endDrag = startDrag;
         repaint();
      }

      public void mouseReleased(MouseEvent e) {
         Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());          
         shapes.add(r); 
         if (startDrag.x > endDrag.x)
            midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
         else 
            midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
         int[] xs = { startDrag.x, endDrag.x, midPoint.x };
         int[] ys = { startDrag.y, startDrag.y, midPoint.y };          
         triangle = new Polygon(xs, ys, 3);               
         startDrag = null;
         endDrag = null;
         repaint();
        }
     });

     this.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseDragged(MouseEvent e) {
           endDrag = new Point(e.getX(), e.getY());
           repaint();
        }
     });
  }

  public void paint(Graphics g) {
     Graphics2D g2 = (Graphics2D) g;
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     paintBackground(g2);
     Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
     int colorIndex = 0;
     g2.setStroke(new BasicStroke(1));
     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
     g2.fillPolygon(triangle);        
     }
}

您在屏幕上看到的是您在绘制函数中绘制的内容。目前,您只在三角形变量中存储一个三角形,并不断替换和绘制它

您需要的是存储一个三角形列表,并在MouseRelease中每次向列表中添加一个新的三角形。以下是需要更改的内容:

private class PaintSurface extends JComponent {
   ...
   //Polygon triangle;
   List<Polygon> triangles = new LinkedList<Polygon>();
   ...

   public PaintSurface() {

      public void mouseReleased(MouseEvent e) {
         ...
         //triangle = new Polygon(xs, ys, 3);
         triangles.add( new Polygon(xs, ys, 3); );
         ...
        }
     });
     ...
  }

  public void paint(Graphics g) {
     ...
     //g2.fillPolygon(triangle);
     for (Polygon triangle : triangles) g2.fillPolygon(triangle);
     ...
   }
}
私有类PaintSurface扩展JComponent{
...
//多边形三角形;
列表三角形=新建LinkedList();
...
公共漆面(){
公共无效MouseEvent(MouseEvent e){
...
//三角形=新多边形(xs,ys,3);
添加(新多边形(xs,ys,3););
...
}
});
...
}
公共空间涂料(图g){
...
//g2.填充多边形(三角形);
对于(多边形三角形:三角形)g2.fillPolygon(三角形);
...
}
}

您在屏幕上看到的是您在绘制功能中绘制的内容。目前,您只在三角形变量中存储一个三角形,并不断替换和绘制它

您需要的是存储一个三角形列表,并在MouseRelease中每次向列表中添加一个新的三角形。以下是需要更改的内容:

private class PaintSurface extends JComponent {
   ...
   //Polygon triangle;
   List<Polygon> triangles = new LinkedList<Polygon>();
   ...

   public PaintSurface() {

      public void mouseReleased(MouseEvent e) {
         ...
         //triangle = new Polygon(xs, ys, 3);
         triangles.add( new Polygon(xs, ys, 3); );
         ...
        }
     });
     ...
  }

  public void paint(Graphics g) {
     ...
     //g2.fillPolygon(triangle);
     for (Polygon triangle : triangles) g2.fillPolygon(triangle);
     ...
   }
}
私有类PaintSurface扩展JComponent{
...
//多边形三角形;
列表三角形=新建LinkedList();
...
公共漆面(){
公共无效MouseEvent(MouseEvent e){
...
//三角形=新多边形(xs,ys,3);
添加(新多边形(xs,ys,3););
...
}
});
...
}
公共空间涂料(图g){
...
//g2.填充多边形(三角形);
对于(多边形三角形:三角形)g2.fillPolygon(三角形);
...
}
}
您保留了对总共一个三角形对象的引用,因此每次重新绘制画布时,您都将绘制这一个多边形

有两种解决方案:

  • 创建
    多边形
    对象的列表,并在调用
    绘制
    时绘制所有对象。您的鼠标侦听器将向列表中添加一个新条目
  • 将多边形绘制到图形上,然后使用“绘制”方法。如果计划绘制多个三角形,这可能是更好的选择
您保留了对总共一个三角形对象的引用,因此每次重新绘制画布时,您都将绘制这一个多边形

有两种解决方案:

  • 创建
    多边形
    对象的列表,并在调用
    绘制
    时绘制所有对象。您的鼠标侦听器将向列表中添加一个新条目
  • 将多边形绘制到图形上,然后使用“绘制”方法。如果计划绘制多个三角形,这可能是更好的选择

    • 不太奇怪。您有一个三角形对象,一旦开始绘制新三角形,就会覆盖该对象

      创建一个三角形数组/列表,并让绘图例程绘制该数组/列表

      我的java修改:

      .....
        private class PaintSurface extends JComponent {
           Point startDrag, endDrag, midPoint;
           List triangles = new ArrayList();
           public PaintSurface() {
              this.addMouseListener(new MouseAdapter() {
              public void mousePressed(MouseEvent e) {
                 startDrag = new Point(e.getX(), e.getY());
                 endDrag = startDrag;
                 repaint();
        }
      
        public void mouseReleased(MouseEvent e) {
           Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());          
           shapes.add(r); 
           if (startDrag.x > endDrag.x)
              midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
           else 
              midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
           int[] xs = { startDrag.x, endDrag.x, midPoint.x };
           int[] ys = { startDrag.y, startDrag.y, midPoint.y };          
           Polygon triangle = new Polygon(xs, ys, 3);            
           traingles.add(triangle);
           startDrag = null;
           endDrag = null;
           repaint();
          }
       });
      
       this.addMouseMotionListener(new MouseMotionAdapter() {
          public void mouseDragged(MouseEvent e) {
             endDrag = new Point(e.getX(), e.getY());
             repaint();
          }
       });
        }
      
        public void paint(Graphics g) {
             Graphics2D g2 = (Graphics2D) g;
             g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             paintBackground(g2);
             Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
             int colorIndex = 0;
             g2.setStroke(new BasicStroke(1));
             g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
             Iterator iter = triangles.iterator();
             while( iter.hasNext() ) {
                g2.fillPolygon((Polygon)iter.next());        
             }
        }
        }
      

      不太奇怪。您有一个三角形对象,一旦开始绘制新三角形,就会覆盖该对象

      创建一个三角形数组/列表,并让绘图例程绘制该数组/列表

      我的java修改:

      .....
        private class PaintSurface extends JComponent {
           Point startDrag, endDrag, midPoint;
           List triangles = new ArrayList();
           public PaintSurface() {
              this.addMouseListener(new MouseAdapter() {
              public void mousePressed(MouseEvent e) {
                 startDrag = new Point(e.getX(), e.getY());
                 endDrag = startDrag;
                 repaint();
        }
      
        public void mouseReleased(MouseEvent e) {
           Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());          
           shapes.add(r); 
           if (startDrag.x > endDrag.x)
              midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
           else 
              midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
           int[] xs = { startDrag.x, endDrag.x, midPoint.x };
           int[] ys = { startDrag.y, startDrag.y, midPoint.y };          
           Polygon triangle = new Polygon(xs, ys, 3);            
           traingles.add(triangle);
           startDrag = null;
           endDrag = null;
           repaint();
          }
       });
      
       this.addMouseMotionListener(new MouseMotionAdapter() {
          public void mouseDragged(MouseEvent e) {
             endDrag = new Point(e.getX(), e.getY());
             repaint();
          }
       });
        }
      
        public void paint(Graphics g) {
             Graphics2D g2 = (Graphics2D) g;
             g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             paintBackground(g2);
             Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
             int colorIndex = 0;
             g2.setStroke(new BasicStroke(1));
             g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
             Iterator iter = triangles.iterator();
             while( iter.hasNext() ) {
                g2.fillPolygon((Polygon)iter.next());        
             }
        }
        }
      

      自定义绘制应在paintComponent()方法中完成,而不是在paint()方法中完成。自定义绘制应在paintComponent()方法中完成,而不是在paint()方法中完成。