Как создать карту изображений с помощью Java Swing?

Мне нужно создать карту изображений с помощью Swing, которая отображает фоновое изображение, а затем, когда мышь наводит курсор (или щелкает) на определенные горячие точки, мне нужно всплывать «увеличенное» изображение и отображать его.

Я думал о расширении JPanel, чтобы включить ссылку на изображение и нарисовать ее с помощью метода paintComponent(g). Эту часть я сделал до сих пор, и вот код:

public class ImagePanel extends JPanel
{
    private static final long serialVersionUID = 1L;

    private Image image;

    public ImagePanel(Image image)
    {
        setImage(image);
    }

    public void setImage(Image newImage)
    {
        image = newImage;
    }

    @Override
    public void paintComponent(Graphics g)
    {
        Dimension size = getSize();
        g.drawImage(image, 0, 0, size.width, size.height, this);
    }

Может ли кто-нибудь порекомендовать, как я могу слушать / реагировать на щелчки мыши по определенным горячим точкам? Может ли кто-нибудь дополнительно порекомендовать способ отображения всплывающих окон? Моя внутренняя реакция состояла в том, чтобы расширить JPopupMenu, чтобы он отображал изображение, подобное приведенному выше коду.

Спасибо за любую помощь!


person Cuga    schedule 08.10.2009    source источник


Ответы (2)


Чтобы прослушивать щелчки мыши, реализуйте MouseListener интерфейс и добавьте его на свою панель. Затем, когда получен щелчок, вы можете использовать JPopupMenu, как вы предложили, или вы даже можете использовать стеклянную панель, чтобы показать увеличенное изображение.

Я предполагаю, что вы хотите добиться чего-то подобного этому post Джошуа Мариначчи, он также разместил исходный код здесь, я бы посмотрел на это.

person broschb    schedule 08.10.2009

Я бы, наверное:

  • создайте некоторый экземпляр Shape, который представляет каждую из ваших горячих точек (может быть простой скучный старый прямоугольник или см. GeneralPath, если вам нужно создать причудливые формы)
  • зарегистрируйте MouseListener, который перебирает каждую из фигур и вызывает свой метод contains(), чтобы увидеть, находится ли щелкнутая координата внутри рассматриваемой горячей точки
person Neil Coffey    schedule 08.10.2009
comment
Я бы хотел это сделать, но я не упомянул, что горячие точки на изображении могут быть произвольными. Таким образом, можно было бы обойти это, наложив дополнительные изображения, но я не уверен, хочу ли я это делать. - person Cuga; 08.10.2009