Как получить расположение X и Y изображения в JScrollPane

Я пытаюсь создать редактор карт для 2D-ролевой игры, и то, что я сейчас пытаюсь сделать (разместить плитки на земле), состоит в том, чтобы иметь JScrollPane с JLabel (в котором есть изображение) и прикрепленный прослушиватель мыши в JScrollPane, чтобы определить положение X и Y изображения. Проблема, с которой я сталкиваюсь, заключается в том, что он получает не расположение изображений X и Y, а расположение JScrollPanes X и Y.

Итак, у меня есть JScrollPane, прикрепленный к изображению размером 512x4928, я прикрепил к нему прослушиватель мыши. проблема возникает, когда я пытаюсь получить местоположение Y, поскольку JScrollPane является отдельным объектом, он получает X и Y размера JScrollPane. Размер JScrollPanes составляет 512x600, независимо от того, где находится изображение, он никогда не вернет значение больше, чем 600.

Как я могу заставить это работать?

Вот код

public void loadMapTileImage(){
    try {
        image = ImageIO.read(getClass().getResource("data/misc/tiledata.png"));
        image = image.getSubimage(0, 0, 512, 4928);
    } catch (IOException e) {
        e.printStackTrace();
    }
    ImageIcon i = new ImageIcon(image);
    MapEditorGlobalObjects.mapTileScroll = new JScrollPane(new JLabel(i));
}

mapTileScroller.addMouseListener(new MouseListener() {

        @Override
        public void mouseReleased(MouseEvent arg0) {
            MapEditorGlobalObjects.checkIfDebugging("Mouse Released Location X = "+arg0.getX());
            MapEditorGlobalObjects.checkIfDebugging("Mouse Released Location Y = "+arg0.getY());

        }
        @Override
        public void mousePressed(MouseEvent arg0) {
            MapEditorGlobalObjects.checkIfDebugging("Mouse Clicked Location X = "+arg0.getX());
            MapEditorGlobalObjects.checkIfDebugging("Mouse Clicked Location Y = "+arg0.getY());

        }

person Loligans    schedule 24.09.2013    source источник


Ответы (2)


Вместо того, чтобы добавлять MouseListener в панель прокрутки, попробуйте добавить его в компонент представления панели прокрутки (то есть то, что отображается в панели прокрутки)

Изображение в этом примере 2560x1600.

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestScrollPanePos {

    public static void main(String[] args) {
        new TestScrollPanePos();
    }

    public TestScrollPanePos() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(new TestPane()));
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage bg;
        private Point point;

        public TestPane() {
            try {
                bg = ImageIO.read(new File("/path/to/image));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            addMouseMotionListener(new MouseAdapter() {

                @Override
                public void mouseMoved(MouseEvent e) {
                    System.out.println(e.getPoint());
                    point = e.getPoint();
                    repaint();
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            return bg == null ? new Dimension(200, 200) : new Dimension(bg.getWidth(), bg.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                int x = (getWidth() - bg.getWidth()) / 2;
                int y = (getHeight()- bg.getHeight()) / 2;
                g2d.drawImage(bg, x, y, this);
                if (point != null) {
                    FontMetrics fm = g2d.getFontMetrics();
                    g2d.setColor(Color.BLACK);
                    g2d.drawString(point.x + "x" + point.y, point.x, point.y - fm.getHeight() + fm.getAscent());
                }
                g2d.dispose();
            }
        }
    }

}
person MadProgrammer    schedule 24.09.2013
comment
Хороший! Мне нравится, намного чище. Спасибо, что научили меня чему-то новому. - person Loligans; 25.09.2013

Если вы используете для этого JScrollPane, получите значение вертикальной полосы прокрутки и добавьте его к значению Y от прослушивателя мыши, и вы получите правильное значение.

person Loligans    schedule 24.09.2013