java - Java - 相对于 JFrame 的光标位置
问题描述
尝试使用以下方法使对象跟随光标:
int mx =(int) MouseInfo.getPointerInfo().getLocation().getX()-50;
Player.setX(mx);
在我的勾选方法中。但是,这会返回屏幕上的光标位置,我怎样才能使它相对于 JFrame 本身?有没有办法读取画布左上角的位置,以便我可以添加偏移量?
解决方案
创建一个鼠标监听器,并从那里获取坐标:
public class SimpleFrame extends JFrame {
public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
frame.setSize(new Dimension(200, 300));
frame.setLocation(new Point(500, 600));
frame.setVisible(true);
frame.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println(e.getX() + " / " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
}
}
当您对此进行测试时,您可能会意识到您希望拥有相对于其他东西的坐标,例如应用程序的主面板。然后为该组件创建 mouselistener:
SimpleFrame frame = new SimpleFrame();
JPanel mainPanel = new JPanel();
frame.add(mainPanel, ...);
mainPanel.addMouseListener(...
这样做比从 JFrame 的 mouseListener 获得的坐标中减去常量要好得多,因为这些“常量”会因操作系统等而有所不同。
如果你想在用户移动鼠标时有事件,不仅仅是当他/她点击它时,使用这个:
frame.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
System.out.println(e.getX() + " / " + e.getY());
}
@Override
public void mouseDragged(MouseEvent e) {
});
推荐阅读
- arrays - 如何操作二维数组
- ruby - ruby 'do' 迭代循环的评估结果是什么?
- amazon-web-services - 尽管升级了内存大小,但在 AWS EC2 上运行的 Jenkins 磁盘空间不足
- java - 在 java 中使用 Keycloak 以编程方式对用户进行身份验证
- javascript - 克隆的表单提交不适用于 jQuery
- oracle - 为什么我不能从 tomcat 数据源执行相同的过程?
- c++ - 如何使用 CreateFontA 设置字体大小?
- logging - 使用 awk 打印变量列
- android - 适用于 Android 的 Google Maps SDK - 费用
- php - Laravel 5.6 自定义中间件打破模型绑定