Java MouseAdapter - PullRequest
       6

Java MouseAdapter

0 голосов
/ 28 мая 2020

Итак, у меня есть собственный адаптер для мыши. Я хочу вызвать метод, если: Координаты x и y находятся в прямоугольнике с, например, координатами x = 40 y = 40 и шириной = 10 length = 10. Как я могу проверить, совпадают ли координаты x и y ( мышь) находятся в прямоугольнике? Я пробовал это:

@Override
public void mouseClicked(MouseEvent e) {
    if(isXinBounds(e.getX()) || isYinBounds(e.getY())) {
        //This happens if the mouse click is in the rectangle
    }
}

//Check if the x coordinate of the mouse click is in the rectangle
private boolean isXinBounds(int x) {
    if(x <= ob.getBounds().getX() + ob.getBounds().getWidth() / 2 && x >= ob.getBounds().getX() - ob.getBounds().getWidth() / 2) return true;
    return false;
}

//Check if the y coordinate of the mouse click is in the rectangle
private boolean isYinBounds(int y) {
    if(y <= ob.getBounds().getY() + ob.getBounds().getHeight() / 2 && y >= ob.getBounds().getY() - ob.getBounds().getHeight() / 2) return true;
    return false;
}

Но это не сработало

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Координаты x и y указаны в прямоугольнике

Класс Rectangle уже поддерживает метод contains(…).

Вы можете просто использовать:

if (yourRectangle.contains(e.getPoint())
    // do something
1 голос
/ 28 мая 2020

Вы делаете действительно странную формулу, чтобы проверить, находится ли ваш щелчок в пределах вашего прямоугольника.

Если мы установим координаты прямоугольника:

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);
    }
}

enter image description here

И, как вы можете видеть на изображении выше, работает отлично.

...