向负方向发出绘图矩形 - Java

时间:2015-06-19 15:20:04

标签: java jframe paintcomponent jdialog

我在尝试从点击屏幕上的点向负方向绘制矩形时遇到问题。我有以下类来模拟像Gyazo这样的屏幕捕获软件:

class DrawSquare extends JPanel implements MouseListener, MouseMotionListener {

// Components
public JDialog frame;
public Rectangle rectangle;
public BufferedImage bufferedImage;
public Point start, end;

// Variables
public String capturedImage;

public DrawSquare(JDialog frame) {

    this.frame = frame;

    // Read in crosshair image to replace mouse icon
    Toolkit tool = Toolkit.getDefaultToolkit();
    Image newImage = getToolkit().getImage("components/cursor.png");
    Cursor cursor = tool.createCustomCursor(newImage, new Point (this.frame.getX(), this.frame.getY()), "img");

    this.frame.setCursor(cursor);
    this.frame.addMouseListener(this);
    this.frame.addMouseMotionListener(this);

}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g.create();
    // draw background overlay
    g2d.drawImage(bufferedImage, WIDTH, 0, this);
    if (rectangle != null) {
        //g2d.setColor(new Color(225, 225, 255, 128));
        frame.setOpacity(0.6f);
        //g2d.fill(rectangle);
        System.out.println(rectangle);
        g2d.setColor(new Color(72,119,205));
        g2d.draw(rectangle);
    }
    g2d.dispose();
}

@Override
public void mouseDragged(MouseEvent e) {

    this.end = e.getPoint();
    int width = end.x - start.x;
    int height = end.y - start.y;

    rectangle.setSize(new Dimension(width, height));
    frame.validate();
    frame.repaint();
}

@Override
public void mouseMoved(MouseEvent e) {
    this.start = e.getPoint();
    frame.validate();
    frame.repaint();
}


@Override
public void mousePressed(MouseEvent e) {
    // Get the X and Y point from the mouse pressed
    rectangle = new Rectangle(start);
    System.out.println(rectangle);
    // Repaint the screen
    frame.validate();
    frame.repaint();
}

@Override
public void mouseReleased(MouseEvent e) {}

@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}

}

现在已经提到问题的原因是,当我试图在点击屏幕的点的相反方向或负方向上绘制矩形框时,它不会绘制,矩形信息看起来像在这样的尝试期间:

java.awt.Rectangle[x=635,y=395,width=-316,height=-194]

但是,当我将rectnagle向正方向拖动时,它的工作原理如下:

enter image description here

我想知道的是我如何使用宽度/高度的负值来解决这个问题,或者完全以另一种方式做到这一点。

2 个答案:

答案 0 :(得分:3)

你实际上应该有2个点 - 拖动开始点和当前拖动点。

计算矩形:

x=min(dragStartPoint.x, dragCurrentPoint.x)
y=min(dragStartPoint.y, dragCurrentPoint.y)
width=abs(dragStartPoint.x - dragCurrentPoint.x)
height=abs(dragStartPoint.y - dragCurrentPoint.y)

答案 1 :(得分:2)

增加宽度和高度都可以。 当它们减少并达到0时,你需要减少x和y。

或以其他方式看到:一个矩形位于两个对角点之间,并且是一个矩形。当一个坐标(x或y)交叉时,这些角色会发生变化。

正面:你拖动右下角(我猜)。 两个坐标均为零:TL和BT联合,W和H为零。 两个坐标都为负:您将右下角的点留在左右位置并拖动矩形的左上角,W和H从0开始增加。

最简单的是:

  • 保持鼠标按下from
  • 拖动鼠标拖动点to

计算它们之间的矩形:

Point min = new Point(Math.min(from.x, to.x), Math.min(from.y, to.y));
Point max = new Point(Math.max(from.x, to.x), Math.max(from.y, to.y));

然后很容易计算矩形。