簡體   English   中英

鼠標拖動時繪制形狀

[英]Drawing shape on mouse drag

class MyPanel extends JPanel implements Observer, MouseMotionListener, MouseListener {
private MyModel model;
private View view; 
private String mode; 
private Rectangle rectangle;
private Square square;

public MyPanel(MyModel model, View view) {
    this.setBackground(Color.black);
    this.setPreferredSize(new Dimension(300, 300));
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    this.model = model;
    this.model.addObserver(this);

}

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

    ArrayList<Rectangle> rectangles = this.model.getRectangles();
    for (Rectangle r : getRectangles()) {

        int width = Math.abs(r.getStartPoint().getX() - r.getEndPoint().getX());
        int height = Math.abs(r.getStartPoint().getY() - r.getEndPoint().getY());
    }

    ArrayList<Square> squares = this.model.getSquares();

    for (Square sqr : getSquares()) {

        int xPosition = Math.min(sqr.getStartPoint().getX(), sqr.getEndPoint().getX());
        int yPosition = Math.min(sqr.getStartPoint().getY(), sqr.getEndPoint().getY());
        int width = Math.abs(sqr.getStartPoint().getX() - sqr.getEndPoint().getX());
        int height = Math.abs(sqr.getStartPoint().getY() - sqr.getEndPoint().getY());       
    }

    g2d.dispose();
}

public void update(Observable o, Object arg) {
    this.repaint();
}

@Override
public void mouseDragged(MouseEvent e) {

    if (this.mode.equals("Rectangle")) {

        this.rectangle.setEndPoint(e.getX(), e.getY());
        this.model.addRectangle(this.rectangle);
    }

    else if (this.mode.equals("Square")) {


        // What code should I add here?

        this.model.addSquare(this.square);

    }

}

// MouseListener below
@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mousePressed(MouseEvent e) {

    if (this.mode.equals("Rectangle")) {
        this.rectangle = new Rectangle(e.getX(), e.getY());
    }

    else if (this.mode.equals("Square")) {
        this.square = new Square(e.getX(), e.getY());

    }
}

@Override
public void mouseReleased(MouseEvent e) {

    if (this.mode.equals("Rectangle")) {

        this.rectangle.setEndPoint(e.getX(), e.getY());
        this.model.addRectangle(this.rectangle);
        this.rectangle = null;
    }

    else if (this.mode.equals("Square")) {
        this.model.addSquare(this.square);
        this.square = null;
    }

}

@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}

}

用戶選擇一種模式,矩形或正方形。 然后他們可以用鼠標繪制一個正方形或一個矩形(顯示實時反饋)。 這是我的繪圖面板類。 我成功地實現了矩形模式。 用戶可以繪制一個矩形,並在移動鼠標時以中間結構顯示該矩形。 我想對方形模式執行相同操作。 由於某種原因,我很難做到這一點。 當用戶移動鼠標時,如何在中間結構中顯示一個完美的正方形?釋放后如何繪制? 我應該在paintComponent方法,mouseDragged,mousePressed和mouseReleased方法中添加什么代碼? 矩形很容易,因為沒有約束,但是我不確定如何在當前的實現中對正方形進行處理。

    int width = Math.abs(r.getStartPoint().getX() - r.getEndPoint().getX());
    int height = Math.abs(r.getStartPoint().getY() - r.getEndPoint().getY());

我猜正方形的“大小”將是上述兩個值的最大值。

然后,我想您會使用:

r.drawStyle(g2d, xPosition, yPosition, size, size);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM