1

すべての三角形の表示に問題があります。マウスドラッグで三角形を描きます。新しい三角形を描くたびに、前の三角形が消えてしまいました。三角形をそのままにして、描画パネルに多くの三角形が表示されるようにするにはどうすればよいですか?

.....
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);        
     }
}
4

3 に答える 3

3

画面に表示されるのは、ペイント関数で描画したものです。現在、三角形変数には三角形を 1 つだけ格納し、常に置き換えて描画しています。

必要なのは、三角形のリストを保存し、毎回新しい三角形を mouseReleased のリストに追加することです。変更する内容は次のとおりです。

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);
     ...
   }
}
于 2009-09-26T11:06:30.737 に答える
1
Polygon triangle;

合計 1 つの三角形オブジェクトへの参照を保持するため、キャンバスを再描画するたびに、この 1 つのポリゴンを描画します。

いくつかの解決策:

  • Polygonオブジェクトのリストを作成し、paintが呼び出されたときにそれらをすべて描画します。マウス リスナーは、新しいエントリをリストに追加します。
  • ポリゴンをBufferedImageに描画してから、ペイント メソッドで画像を描画します。多くの三角形を描画する予定がある場合は、これがおそらくより良いオプションです。
于 2009-09-26T11:07:21.733 に答える
1

あまり奇妙ではありません。新しい三角形の描画を開始するとすぐに上書きする 1 つの三角形オブジェクトがあります。

三角形の配列/リストを作成し、描画ルーチンにそれを描画させます。

私の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());        
       }
  }
  }
于 2009-09-26T11:07:36.797 に答える