如何在JScrollPane中获取图像的X和Y位置

我正在尝试为2D RPG制作地图编辑器,而我目前正在尝试做的事情(将地块放置在地面上)是有一个带有JLabel的JScrollPane(其中有一个图像)和一个附加的鼠标侦听器到JScrollPane来确定图像的X和Y位置。 我遇到的问题是它没有得到图像X和Y位置,而是JScrollPanes X和Y位置。

所以我有一个JScrollPane附加到一个512×4928的图像,我附加了一个鼠标监听器。 当我尝试获取Y位置时问题就存在了,因为JScrollPane是一个单独的对象,它获得了JScrollPane JScrollPanes大小的X和Y,无论图像位于何处,它都将永远不会返回大于600。

我能以任何方式使这项工作?

inheritance守守则

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

不要将MouseListener添加到滚动窗格,而是尝试将其添加到滚动窗格的视图组件(即滚动窗格显示的内容)

此示例中的图像是2560×1600

在此处输入图像描述

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

如果您使用JScrollPane,请获取垂直滚动条的值,并将其添加到鼠标侦听器的Y值,您将获得正确的值