繁体   English   中英

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

[英]How do I get the X and Y location of an image in a JScrollPane

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

因此,我将JScrollPane附加到512x4928的图像上,并在其上附加了鼠标侦听器。 当我尝试获取Y位置时,问题就存在了,因为JScrollPane是一个单独的对象,所以无论图像位于何处,JScrollPane的大小都为512x600,从而获得XScroll和Y的大小。 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());

        }

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

}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM