Java найти какое изображение я нажал? - PullRequest
4 голосов
/ 06 ноября 2011

Сценарий: у меня есть один JFrame и JPanel, добавленный к этому JFrame. На этой панели я нарисовал 3 изображения, используя:

public void paint(graphics g) { 
     g.drawImage(img1,100,100,null);
     g.drawImage(img2,200,200,null);
     g.drawImage(img3,300,300,null);
}

Я реализовал MouseListener интерфейс для прослушивания кликов. Теперь я хочу, чтобы всякий раз, когда я щелкаю по любому из этих изображений, мой вывод (в командной строке с использованием System.out.println();) должен быть объектом изображения, по которому я щелкнул?

Пожалуйста, объясните мне, возможно ли это и как?

Ответы [ 2 ]

7 голосов
/ 06 ноября 2011

Ну, во-первых, вы рисуете все свои изображения в (0,0), вы уверены, что хотите это сделать? Если вы сделаете это, возможно, вы нажмете точку, которая принадлежит всем вашим изображениям (es, 0,0).

Кстати, внутри вашего MouseListener у вас есть этот метод:

public void mouseClicked(MouseEvent e)
{
    Point point = e.getPoint();
}

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

Rectangle imageBounds = new Rectangle(x,y,image_width, image_height);
if (imageBounds.contains(point)){
    //point is inside given image
}

где x, y - это координата, в которой вы рисуете изображение с помощью метода drawImage (0,0 в вашем случае), а image_width, image_height - это размер вашего изображения.

EDIT:

есть альтернатива решению, которое я объяснил выше. Как и в случае с Hovercraft Full Of Eels, вы можете сделать следующее:

  1. создайте JLabel для каждого изображения, которое вы хотите отобразить
  2. используйте метод JLabel setIcon () , чтобы указать изображение, которое будет отображаться на каждой метке.
  3. Добавьте ваши ярлыки в JPanel
  4. добавить слушателя мыши для каждого JLabel

Этот подход имеет большое преимущество: вам не нужно беспокоиться о координатах мыши, потому что у каждого JLabel есть свой относительный слушатель мыши. Единственное, что вам следует учитывать, это следующее:

используя Компонент вместо того, чтобы рисовать ваши изображения, вы не сможете полностью отравить их, но вы должны использовать подходящий LayoutManager для размещения вашего JLabel.

0 голосов
/ 06 ноября 2011

Вот что я сделал для простой карточной игры, над которой работал:

  1. Необязательно: Создайте объект, представляющий ваше кликабельное изображение. Он должен знать его (x, y), ширину / высоту и как рисовать себя на экране.
  2. Сохраняйте ссылку на все ваши интерактивные изображения в коллекции (например, список).
  3. Создайте метод, чтобы определить, находится ли позиция клика пользователя в границах вашего кликабельного изображения (я поместил это в объект, созданный из # 1).
  4. На mouseClicked (или других применимых методах в вашем слушателе) просмотрите вашу коллекцию изображений и вызовите wasClicked () , который может выглядеть примерно так:

    public boolean wasClicked( int x, int y ) {
    
        return( x > getX() && x < ( getX() + getWidth() ) && 
                y > getY() && y < ( getY() + getHeight() ) );
    
    }
    

Ваша реализация может отличаться. В качестве альтернативы вы также можете расширить JComponent и добавить к нему MouseListener, но по причинам, которые я не могу вспомнить в данный момент, вышеописанное сработало для меня лучше в моем случае.

...