向负方向发出绘图矩形 - Java
Issue drawing rectangle in negative direction - Java
我在尝试从屏幕上单击的点沿负方向绘制矩形时遇到问题。我有以下 class 模拟像 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]
但是,当我朝正方向拖动矩形时,它按预期工作:
我想知道的是如何使用 width/height 的负值或完全以其他方式解决此问题。
增加宽度和高度没问题。
当它们减少,并达到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));
那么这个矩形就很容易算出来了
您实际上应该有 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)
我在尝试从屏幕上单击的点沿负方向绘制矩形时遇到问题。我有以下 class 模拟像 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]
但是,当我朝正方向拖动矩形时,它按预期工作:
我想知道的是如何使用 width/height 的负值或完全以其他方式解决此问题。
增加宽度和高度没问题。 当它们减少,并达到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));
那么这个矩形就很容易算出来了
您实际上应该有 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)