我正在尝试为2D RPG制作地图编辑器,而我目前正在尝试做的事情(将地块放置在地面上)是使用带有JLabel的JScrollPane(其中包含图像)和鼠标侦听器附加到JScrollPane以确定图像的X和Y位置。我遇到的问题是它没有获得图像X和Y位置,而是获得JScrollPanes X和Y位置。
所以我有一个连接到512x4928的Image的JScrollPane,我附加了一个鼠标监听器。当我尝试获取Y位置时问题存在,因为JScrollPane是一个单独的对象,它获取JScrollPane大小的X和Y 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());
}
答案 0 :(得分:3)
不要将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();
}
}
}
}
答案 1 :(得分:0)
如果您使用JScrollPane,请获取垂直滚动条的值,并将其添加到鼠标侦听器的Y值,您将获得正确的值