如何在JFrame内指定鼠标单击的坐标?

时间:2014-08-04 23:55:11

标签: java swing awt mouselistener

所以我正在制作一个基本的游戏而且我被鼠标困住了。我现在拥有它到你点击的位置,它会打印出坐标或点击的位置。唯一的问题是它打印的坐标是我整个电脑屏幕的坐标,而不是我JFrame中的坐标。我已经查了一下,我看到了一些关于将它添加到框架中的东西但是,我已经尝试过......

frame.addMouseListener(new MouseInput(client));

这是我所拥有的基础知识。

public void init(){
addMouseListener(new MouseInput(this));
}

public static void main(String[] args){
    Client client = new Client();

    client.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    client.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    client.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    //client.addMouseListener(new MouseInput(client));

    JFrame frame = new JFrame(client.title);
    frame.add(client);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.addMouseListener(new MouseInput(client));

    client.start();
}    

public void mouseClicked(MouseEvent e) {
    PointerInfo a = MouseInfo.getPointerInfo();
    Point b = a.getLocation();
    double x = (double) b.getX();
    double y = (double) b.getY();
    m.setX((int) x);
    m.setY((int) y);
    System.out.println("Mouse Clicked at ( " + x + ", " + y + ")");
}

和这个班......:

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class MouseInput extends JFrame implements MouseListener
 {
private int x = 0;
private int y = 0;

Client client;

public MouseInput(Client client){
    this.client = client;
}

public void mouseClicked(MouseEvent e) {
    client.mouseClicked(e);
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
    client.mouseReleased(e);
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public int getX(){
    return x;
}

public int getY(){
    return y;
}

public void setX(int x){
    this.x = x;
}

public void setY(int y){
    this.y = y;
}
}

2 个答案:

答案 0 :(得分:2)

不要使用PointerInfo,所有您需要的信息都会通过MouseEvent传递给您......

MouseEvent包含相对于在...中引发的组件的鼠标事件的局部x / y坐标。

public void mouseClicked(MouseEvent e) {
    int localX = e.getX();
    int localY = e.getY();

要将localX/Y翻译成另一个组件的上下文,您可以使用类似的内容......

e = SwingUtilities.convertMouseEvent(e.getComponent(), e, frame);
// Where frame would be the component you want to translate the current
// local context into

请查看SwingUtilities.convertMouseEvent(Component, MouseEvent, Component)SwingUtilities.convertPoint(Component, Point, Component)SwingUtilities.convertPoint(Component, int, int, Component)了解详情。

另外,请查看How to Write a Mouse Listener

通常情况下,最好将侦听器连接到您感兴趣的组件,而不是框架,框架由多个分层组件组成,所有这些组件都可能消耗鼠标事件,从而阻止您的框架接收鼠标事件< / p>

答案 1 :(得分:0)

您可以只使用传递给回调方法的MouseEvent,而不是使用PointerInfo。具体来说,您可以使用e.getX()和e.getY()来获取相对于框架左上角的x和y位置。见http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html