2017-07-23 101 views
0

当前,此代码段通过鼠标单击来移动已经绘制在框架上的当前矩形。该点击的坐标转至变量xy。无论在框架上点击什么,矩形都会移动到该位置。我想它只是画一个新的矩形,所以例如当我在屏幕上随机点击10次时,会出现10个矩形。你怎么做到这一点?在鼠标点击上绘制每个矩形而不是setLocation

public void moveRectangleTo(int x, int y) 
     { 
      box.setLocation(x, y); 
      repaint();  
     } 

全码: RectangleComponent类

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JComponent; 

public class RectangleComponent2 extends JComponent 
{ 
    private static final int BOX_X = 100; 
    private static final int BOX_Y = 100; 
    private static final int BOX_WIDTH = 20; 
    private static final int BOX_HEIGHT = 30; 

    private Rectangle box; 

    public RectangleComponent2() 
    { 
     box = new Rectangle(BOX_X, BOX_Y, BOX_WIDTH, BOX_HEIGHT);   
    } 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 

     g2.draw(box); 
    } 

    public void moveRectangleTo(int x, int y) 
    { 
     box.setLocation(x, y); 
     repaint();  
    } 
} 

矩形框架类:

import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 

public class RectangleFrame2 extends JFrame { 
    private static final int FRAME_WIDTH = 300; 
    private static final int FRAME_HEIGHT = 400; 
    private RectangleComponent2 scene; 

    class MousePressListener implements MouseListener { 
     public void mousePressed(MouseEvent event) { 
     int x = event.getX(); 
     int y = event.getY(); 
     scene.moveRectangleTo(x, y); 
     } 
     public void mouseReleased(MouseEvent event) {} 
     public void mouseClicked(MouseEvent event) {} 
     public void mouseEntered(MouseEvent event) {} 
     public void mouseExited(MouseEvent event) {} 
    } 

    public RectangleFrame2() { 
     scene = new RectangleComponent2(); 
     add(scene); 

     setSize(FRAME_WIDTH, FRAME_HEIGHT); 

     MouseListener listener = new MousePressListener(); 
     scene.addMouseListener(listener); 
    } 
} 

回答

3

你需要保持一个框的列表。

private List<Rectangle> boxes = new ArrayList<>(); 

点击鼠标,而不是移动中,添加一个新问题:

public void addRectangleAt(int x, int y) 
    { 
     Rectangle boxNew = new Rectangle(x, y, BOX_WIDTH, BOX_HEIGHT); 
     boxes.add(boxNew); 
     repaint();  
    } 

然后在您的paintComponent()方法,通过你迭代箱列表和油漆每一个。

+0

你能告诉我如何在paintComponent中迭代/循环吗? – visiontech60

+0

@ visiontech60:当然你知道如何使用for循环,不是吗? 1+的答案。还要记住提醒他在paintComponent中调用super的方法。 –

+0

是的,但我不太舒服,使用ArrayList – visiontech60