【问题标题】:Mouse press gets X and Y coördinates right, but doesn't place Image on pressed spot鼠标按下使 X 和 Y 坐标正确,但不会将图像放在按下的位置
【发布时间】:2017-06-28 14:26:01
【问题描述】:

我正在用 java 重新制作一个棋盘游戏。我希望能够单击一个标记,然后单击某个位置,然后将该标记移动到该位置。但是,令牌移动到完全不同的位置。 在图像上,我点击了红色方块,但令牌最终从我点击的实际位置向右下方。 (令牌是圆形的东西,上面有鲜明的标志)

我打印了点击的坐标和位置,看看它们是否会有所不同,但事实并非如此。

点击部分的代码:

map.setOnMousePressed((e -> {
        System.out.println(e.getX());
        System.out.println(e.getY());
        currentOrder.setX(e.getX());
        currentOrder.setY(e.getY());
        System.out.println(currentOrder.getX());
        System.out.println(currentOrder.getY());
        currentOrder = basics;
    }));

坐标的输出:

564.0
365.3333333333333
564.0
365.3333333333333
610.0
267.3333333333333
610.0
267.3333333333333
569.3333333333334
319.3333333333333
569.3333333333334
319.3333333333333

如您所见,点击点的坐标和标记的坐标是相同的。但是,在屏幕上,他们仍然不在同一个地方。

为什么会这样?我该如何解决这个问题?

我尝试从我得到的那个中减去 translateX,我尝试从坐标中减去标记的宽度,我尝试了 getSceneX 和 getScreenX,我尝试了 setLayoutX。所有这一切都在每一种可能的组合中。它似乎都不起作用。有时它甚至给令牌一个固定的 X 位置,只有 Y 改变了。所以,没有任何工作。

我读过但没有帮助的问题:

可能还有一些我再也找不到了。

我使用this 作为参考来制作我的代码部分。

我尝试仅添加相关代码。如果需要我的代码的另一部分进行澄清,请告诉我。

【问题讨论】:

  • 什么是currentOrder
  • currentOrder 是我点击的订单。订单指的是ordertoken。当我单击令牌时,它将 currentOrder 设置为该令牌。然后,当我单击某处时,它使用我从 currentOrder 单击的令牌,然后将 currentOrder 更改回基本状态,这样当我再次单击屏幕时,它就不会再次移动。我在另一个代码中使用了一个非常基本的版本,它在那里工作。
  • 我的意思是,它是什么类型的东西?哪个类定义了它的setXsetY 方法?
  • 抱歉。它是一个 ImageView。
  • ImageView.setX()setY() 不要做你认为他们做的事情。他们在图像视图中设置图像的xy 坐标(即它们定义ImageView 视口的左上角),而不是ImageView 在其容器中的位置。

标签: java image javafx coordinates


【解决方案1】:

在我看来,您将鼠标侦听器添加到名为 map 的组件(然后您将收到相对于地图的坐标)并将徽标添加到 currentOrder 的父组件,该组件具有自己的坐标原点。

根据您的组件顺序,您必须转换坐标。有几种可能性可以做到这一点。一种选择是使用 ScreenUtilities 中的 convertPointFromScreen 和 convertPointToScreen。

PS:在你评论屏幕坐标时给你一些代码——你有没有尝试过类似的东西

Point screen_pt = SwingUtilities.convertPointToScreen(e.getPoint(), map);
Point order_pt = SwingUtilities.convertPointFromScreen(screen_pt, parent);
currentOrder.setX(order_pt.x);
currentOrder.setY(order_pt.y);

这里有父组件作为组件 currentOrder 添加到?

【讨论】:

  • 我也尝试了整个场景的坐标(scene.setOnMousePressed),但这并没有改变问题。就像我之前说的,我还使用 getSceneX 和 getScreenX 来获取屏幕上的坐标,但这并没有改变任何东西。
  • 尝试此操作时出现此错误:方法 getPoint() 未定义为 MouseEvent 类型。
  • 嗯?令我惊讶的是,getPoint() in MouseEvent docs.oracle.com/javase/7/docs/api/java/awt/event/…) 应该存在。无论如何,您也可以改用new java.awt.Point(e.getX(), e.getY())。顺便说一句,查看 API 文档,MouseEvent 中还有 getXOnScreen()getYOnScreen()
  • 我使用的是 Javafx,而不是 awt。
  • 好的,抱歉。我的错误假设。我认为它也有一个Point2D。但是,我不知道坐标系,因为我不知道它在 JavaFX 中是如何组织的。没用过。
猜你喜欢
  • 1970-01-01
  • 2014-02-09
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
相关资源
最近更新 更多