2016-05-19 16 views
0

パネル上に複数の矩形を描画しようとしています。私はArrayList<Shape>を作成し、私のコンストラクタで初期化しました。私のpaintComponentメソッドでは、私は矩形を描画し、それをArrayListに追加します。しかし、私がそれをすると、私のパネル上の描画結果は変わっています。私は私の最初の四角形を描くようにドラッグすると、私はこれを取得:スイングでパネルに複数の矩形を描く

1]

は、ここに私のコードの一部です:

public class MyMouseListener extends MouseAdapter { 
    @Override 
    public void mousePressed(final MouseEvent theEvent) { 
     myStartPoint = theEvent.getPoint(); 
     repaint(); 

    } 

    @Override 
    public void mouseReleased(final MouseEvent theEvent) { 
     myEndPoint = theEvent.getPoint(); 
     repaint();    
    } 
} 

public class MyMouseMotionHandler extends MouseMotionAdapter { 
    @Override 
    public void mouseDragged(final MouseEvent theEvent) {   
     myEndPoint = theEvent.getPoint(); 
     repaint(); 
    }  
} 



/** 
* Paints some rectangles. 
* 
* @param theGraphics The graphics context to use for painting. 
*/ 
@Override 
public void paintComponent(final Graphics theGraphics) { 
    super.paintComponent(theGraphics); 
    final Graphics2D g2d = (Graphics2D) theGraphics; 

    // for better graphics display 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.setPaint(new Color(51, 0, 111)); 
    g2d.setStroke(new BasicStroke(3)); 

    final double x = myStartPoint.getX(); 
    final double y = myStartPoint.getY(); 
    final double xEnd = myEndPoint.getX(); 
    final double yEnd = myEndPoint.getY(); 

    if (xEnd> x && yEnd > y) { 
     final Shape rectangle = new Rectangle2D. 
       Double(x, y, xEnd - x, yEnd - y); 
     g2d.draw(rectangle); 
     myDrawings.add(rectangle); 
    } 


    for (Shape s : myDrawings) { 
     g2d.draw(s); 
    } 
} 
+0

基本的には、 'List'に四角形を追加しないでください – MadProgrammer

答えて

3

はpaintComponent内の任意のコードのロジックをしないでください - メソッドのためのものであること描画と描画のみ、それはあなたのバグの原因です。マウスリスナのArrayListに矩形を追加します。

私が似たようなプロジェクトを行ったとき、私は通常、マウスドラッグでマウスリスナーを使って描画するために使用する1つのRectangleフィールドを持っていて、paintComponent内に描画します。次にマウスを離すと、その長方形がArrayListに配置され、クラスフィールドがnullに設定されます。

例えば、あなたがマウスを放すまで

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class RectangleDraw extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 650; 
    private static final Color TEMP_RECT_COLOR = Color.LIGHT_GRAY; 
    private static final Color SHAPE_COLOR = Color.RED; 
    private Rectangle tempRect = null; 
    private List<Shape> shapes = new ArrayList<>(); 

    public RectangleDraw() { 
     MyMouse myMouse = new MyMouse(); 
     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 

     // draw the temporary rectangle if not null 
     if (tempRect != null) { 
      g2.setColor(TEMP_RECT_COLOR); 
      g2.draw(tempRect); 
     } 

     // draw all the rectangles in the list 
     g2.setColor(SHAPE_COLOR); 
     for (Shape shape : shapes) { 
      g2.draw(shape); 
     } 

    } 

    // size the GUI to my specification 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    // My mouse listener and mouse motion listener 
    private class MyMouse extends MouseAdapter { 
     private Point p1; // start point 

     @Override 
     public void mousePressed(MouseEvent e) { 
      p1 = e.getPoint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      // create temporary rectangle 
      tempRect = createRectangle(e); 
      repaint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      tempRect = null; // null temp rectangle and 
      // add rectangle to List 
      shapes.add(createRectangle(e)); 
      repaint(); 
     } 

     // create a rectangle from start point and current point 
     private Rectangle createRectangle(MouseEvent e) { 
      Point p2 = e.getPoint(); 
      int x = Math.min(p1.x, p2.x); 
      int y = Math.min(p1.y, p2.y); 
      int w = Math.abs(p1.x - p2.x); 
      int h = Math.abs(p1.y - p2.y); 
      Rectangle rect = new Rectangle(x, y, w, h); 
      return rect; 
     } 

    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Rectangle Draw"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new RectangleDraw()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
}