当前位置: 首页 > 知识库问答 >
问题:

Javafx -光标相交形状

应嘉容
2023-03-14

我在一个板上有几个对象,我想通过坐标获取这些对象的索引。我尝试过制作一个MouseEvent处理程序,并使用getBoundInParent()MouseInfo.getPointerInfo().getLocation()相结合,但没有成功。这些方法给了我不同的坐标,无法匹配它们。

我是否应该用光标的坐标画一个矩形,并使用< code > getBoundInParent()。intersects方法?

有什么建议吗?

共有1个答案

施俊明
2023-03-14

解决办法

在每个形状上,提供SetOnMouseEnter和SetOnMouse Exited处理程序,以捕获鼠标进入和退出事件,并记录鼠标所在形状的索引。

假设

我假设您需要与光标热点相交(例如鼠标指针箭头的尖端),而不是光标形状或光标的矩形边界(因为热点的相交是光标工作的标准方式)。

示例应用程序输出

    < li >当您将鼠标悬停在该圆上时,该圆将高亮显示,并且该圆的索引(1)将显示出来 < li >当您将鼠标放在矩形上时,该矩形将高亮显示并显示矩形的索引(2)。 < li >当您不将鼠标悬停在任一形状上时,两个形状都不会突出显示,也不会显示索引。

示例代码

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.effect.DropShadow;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;

public class ShapeIntersector extends Application {
    private static final Shape[] shapes = {
            new Circle(50, Color.AQUAMARINE),
            new Rectangle(100, 100, Color.PALEGREEN)
    };

    private static final DropShadow highlight =
            new DropShadow(20, Color.GOLDENROD);

    @Override
    public void start(Stage stage) throws Exception {
        HBox layout = new HBox(40);
        layout.setPadding(new Insets(30));
        layout.setAlignment(Pos.CENTER);

        Label highlightedShapeLabel = new Label(" ");
        highlightedShapeLabel.setStyle(
                "-fx-font-family: monospace; -fx-font-size: 80px; -fx-text-fill: olive"
        );

        for (Shape shape: shapes) {
            layout.getChildren().add(shape);

            shape.setOnMouseEntered(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    shape.setEffect(highlight);
                    int idx = layout.getChildren().indexOf(shape) + 1;
                    highlightedShapeLabel.setText(
                            "" + idx
                    );
                }
            });

            shape.setOnMouseExited(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    shape.setEffect(null);
                    highlightedShapeLabel.setText(" ");
                }
            });
        }

        layout.getChildren().add(highlightedShapeLabel);

        stage.setScene(new Scene(layout));
        stage.show();
    }

    public static void main(String[] args) { launch(args); }
}
 类似资料:
  • 我目前正在使用JavaFX研究不同形状之间的边界相交。我想检测两个多边形在它们的点上的碰撞,而不是在它们的边界上(即2个多边形)。 请参阅图1:不期望的行为,以及图2:期望的行为。 是否有任何现有的算法可以帮助我或使用任何库?提前感谢:) 在这里找到我的解决方案: 输出: 它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。

  • 我有两个矩形,每个矩形有4个值: 左侧位置< code>X、顶部位置< code>Y、宽度< code>W和高度< code>H: 矩形不旋转,如下所示: 判断两个矩形的交集是否为空的最佳解是什么?

  • 我正在尝试使用postgis执行空间统计。偶尔我会ST_Clip粉碎并停止查询。我认为当面几乎不与栅格相交时会发生这种情况。请参阅下面的示例。 通过上述查询,我收到以下错误。 我希望不返回任何记录,或者某种空栅格。在我的生产代码中,几何/栅格对是通过面表和栅格表之间的找到的。我想过为栅格制作边界框的一种方式,它比栅格的范围略小,但这很丑陋...... 我的postgres和postgis版本是 x

  • 问题内容: 测试2个矩形是否相交的快速方法是什么? 在Internet上进行了搜索,找到了这种单行代码(WOOT!),但我不知道如何用Javascript编写它,它似乎是用C ++的古老形式编写的。 问题答案: 这就是将代码转换为JavaScript的方式。请注意,正如注释所建议的那样,您的代码和本文的代码中都有一个错字。该功能应该并且应该具体起作用。 测试用例:

  • 问题内容: 我有一个40x40的网格,显示地图。当前,我有以下方法监听右键单击: 我要实现以下内容: 如果右键单击后选择了菜单项,则我想将右键单击的位置保存在变量中, 例如[32,12](如果右键单击跨越了32个网格窗格,向上为12块)。 关于如何执行此操作的任何建议? 提前致谢 问题答案: 向网格中的每个单元格添加一个侦听器,而不是向舞台添加一个鼠标侦听器。用于上下文菜单处理的适当侦听器是处理程

  • 光标组件允许我们通过点击和凝视与实体交互。光标组件被用于 光线投射(raycaster)来实现: 监听鼠标点击事件和基于凝视的行为。 仅捕获第一个相交实体。 发出特殊的鼠标和悬停事件(例如,与鼠标向下/向上/进入/离开相关)。 有更多的悬停状态。 当鼠标单击时,与光标相交的最近可见实体(如果有)将发出 单击事件。注意光标组件只是应用了光线投射行为。要为光标提供形状或外观,可以应用 geometry