Вы делаете действительно странную формулу, чтобы проверить, находится ли ваш щелчок в пределах вашего прямоугольника.
Если мы установим координаты прямоугольника:
x = 10
y = 10
width = 50
height = 50
И создадим новый прямоугольник с этими значениями:
Rectangle rect = new Rectangle(x, y, widht, height)
Затем мы можем сделать это как для X, так и для Y
private boolean xIsInBounds(int x) {
if (x >= rect.x && x <= rect.width + x) {
return true;
}
return false;
}
Потому что мы проверяем значения X и Y, поскольку они всегда будут одинаковыми , но мы должны добавить значения X и Y к ширине и высоте соответственно из-за того, что он перемещается из-за того, что значения X и Y не находятся на 0,0.
Другая проблема в вашем коде заключается в том, что вы спрашиваете:
if (xIsInBounds(...) || yIsInBounds(...)) { ... }
Когда это должно быть && вместо || .
Вот код, который производит следующее вывод в виде минимального воспроизводимого примера
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ClickOnBounds extends MouseAdapter {
private JFrame frame;
private JPanel pane;
private static final int X_COORD = 10;
private static final int Y_COORD = 10;
private static final int RECT_WIDTH = 50;
private static final int RECT_HEIGHT = 50;
private Rectangle rect = new Rectangle(X_COORD, Y_COORD, RECT_WIDTH, RECT_HEIGHT);
@SuppressWarnings("serial")
private void createAndShowGUI() {
frame = new JFrame(this.getClass().getSimpleName());
pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.draw(rect);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(70, 70);
}
};
pane.addMouseListener(this);
frame.add(pane);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (xIsInBound(e.getX()) && yIsInBound(e.getY())) {
System.out.println("Yes! " + e.getX() + " " + e.getY());
} else {
System.out.println("No! " + e.getX() + " " + e.getY());
}
}
private boolean xIsInBound(int x) {
if (x >= rect.x && x <= rect.width + X_COORD) {
return true;
}
return false;
}
private boolean yIsInBound(int y) {
if (y >= rect.y && y <= rect.height + Y_COORD) {
return true;
}
return false;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new ClickOnBounds()::createAndShowGUI);
}
}
И, как вы можете видеть на изображении выше, работает отлично.