JAVAFX - 这个X / Y位置有什么东西吗?

时间:2016-04-08 13:20:39

标签: java javafx

我想知道JavaFX中是否有某些功能允许您检测某个getLayoutX / Y()位置是否有某个对象(或某些东西)?然后把它还给你。

例如,我有一个位于X0和Y1的节点;如果我输入X0和Y1,它将返回该对象,但如果我执行X1,Y1,那么它将返回null。

JavaFX中的任何类型?

1 个答案:

答案 0 :(得分:0)

要回答您的直接问题,您可以在根节点上调用内部API impl_pickNode(...)以获取最顶层节点。但是,here是它的更清晰版本。或者,如果您的所有节点只有一个父节点,那么

root.getChildren()
    .stream()
    .filter(n -> n.getLayoutX() == X0 && n.getLayoutY() == Y0)
    .findAny();

返回一个Optional,它将您的对象包装在X0,Y0,或者如果该位置没有对象,则返回null。

上述解决方案是临时性的,适用于小型项目。但是,如果你想要一个更好的程序底层设计(我假设一个游戏?),正如James_D指出的那样,通过使用一个与视图分开的模型会更好,你可以保留你的对象并去通过他们的位置来查看该位置是否有物体。代码可能如下所示:

public Optional<GameObject> getObjectAt(Point2D position) {
    return gameObjects.stream()
                      .filter(obj -> obj.getX() == position.getX()
                                  && obj.getY() == position.getY())
                      .findAny();
}

如果在给定位置可以有多个对象,则可以将上述内容推广为:

public List<GameObject> getObjects(Predicate<GameObject> predicate) {
    return gameObjects.stream()
                      .filter(predicate)
                      .collect(Collectors.toList());
}

你可以打电话:

getObjects(obj -> obj.getX() == X0
               && obj.getY() == Y0
               && obj.getType() == Type.WALL);