如何在JScrollPane中获取图像的X和Y位置 [英] How do I get the X and Y location of an image in a JScrollPane

查看:113
本文介绍了如何在JScrollPane中获取图像的X和Y位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to make a Map Editor for a 2D RPG, and what I currently am trying to do (to place tiles on the ground) is to have a JScrollPane with a JLabel (that has an image in it) and a Mouse Listener attached to the JScrollPane to determine the X and Y location of the image. The problem I run into is that it doesn't get the Images X and Y location but the JScrollPanes X and Y location.

因此,我将JScrollPane附加到512x4928的图像上,并在其上附加了鼠标侦听器.当我尝试获取Y位置时,问题就存在了,因为JScrollPane是一个单独的对象,它获取了JScrollPane大小的X和Y JScrollPanes大小为512x600 无论图像位于何处,都永远不会返回大于600的值.

So I have a JScrollPane attached to an Image that is 512x4928, I attached a mouse listener to it. the problem resides when I try to get the Y location, since JScrollPane is a separate object it gets the X and Y of the size of the JScrollPane JScrollPanes size is 512x600 no matter where the image is at, it will never return a value greater than 600.

有什么办法可以使我工作?

Any way I can make this work?

此处提供了代码

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添加到滚动窗格,请尝试将其添加到滚动窗格的视图组件(即,滚动窗格显示的内容)

Instead of adding the MouseListener to the scrollpane, try adding it to the scroll pane's view component (ie, the thing that the scroll pane is displaying)

此示例中的图片为2560x1600

The image in this example is 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中获取图像的X和Y位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆