如何在子场景中选择形状以允许我进行变换

问题描述 投票:0回答:1

我目前正在使用javafx编写一个程序,该程序向用户询问圆柱体的半径和高度,一旦用户点击添加,它将在子场景中创建一个圆柱体。我想知道如何将setonmouseclicked事件处理程序与圆柱体结合使用,以便我可以选择一个圆柱体并进行诸如缩放,旋转等编辑操作,然后转到下一个形状并单击该圆柱体并然后我就可以进行缩放,旋转等操作,直到下一个。当前,这是当我询问用户并添加圆柱体时发生的情况。

Button addCyl=new Button("Add Cylinder");

    addCyl.setOnAction(event -> {
        String cylRadius=cylRadiusInput.getText();
        String cylHeight=cylHeightInput.getText();

        Double Radius=Double.parseDouble(cylRadius);
        Double Height=Double.parseDouble(cylHeight);

        Cylinder cylinder=new Cylinder(Radius, Height);

        shapeGroup.getChildren().add(cylinder);

    });
user-interface javafx 3d controls shapes
1个回答
3
投票

如何选择节点

“如何区分正在点击的圆柱体,以便可以对特定圆柱体进行更改?”

您没有,JavaFX节点选择实现将为您做到这一点。在对象上设置单击处理程序时,将在单击对象时调用该处理程序,因此,在调用该处理程序时,您将知道用户已单击该对象。

如何保存选择

创建形状时,为其创建一个单击处理程序,并在单击该节点时,为所选节点设置一个字段。

private Group shapeGroup = new Group():
private Cylinder selectedNode;

// omitted ... add shapeGroup to sub-scene

private void addNode() {
    Cylinder cylinder = new Cylinder(radius, height);
    cylinder.setOnMouseClicked(e -> {
        selectedNode = cylinder;
    });
    shapeGroup.getChildren().add(cylinder);
}

如何修改所选项目

要定义将要在选定节点上执行的操作,例如更改半径,然后可以执行以下操作:

private Slider radius = new Slider(10, 100, 20);

// omitted ... add radius control to scene

radius.valueProperty().addListener(
    (observable, oldValue, newValue) -> {
        if (selectedNode != null) {
            selectedNode.setRadius(newValue);
        }
    }
); 

如何从选定节点向控件设置值

[如果需要,当选择一个节点时,可以将控件的值设置为所选节点的当前值,例如

cylinder.setOnMouseClicked(e -> {
    selectedNode = cylinder;
    radius.setValue(selectedNode.getRadius());
});

示例节点选择应用

此处讨论的概念的示例在以下示例应用程序中演示:

即使演示示例是2D的,对于2D和3D,节点选择和随后通过控件修改项属性的概念也没有什么不同。

如何处理多个选择

如果要添加多个选择同时可以选择多个节点的选择,则要复杂一些。您可以使用以下答案中定义的一些概念(链接的问题适用于2D,但是3D在这方面并没有什么不同)。

关于深度排序和模糊节点的处理方法

因为它是3D,所以对象可以具有z深度,并且可以进行深度排序。如果一个对象在另一个对象后面,要允许用鼠标选择被遮挡的对象,您将需要具有一种机制,允许用户将遮挡的对象移开(例如,通过选择并拖动它们来移动它们) ,或将场景旋转到另一个视点,不再希望遮挡用户希望单击的对象(有关如何完成此类操作的信息超出了此答案的范围)。

获取详细的选择信息

如果您需要有关被捡东西的更多信息,例如拾取节点上的点(在3D空间中),或拾取节点的面或纹理坐标的位置,然后可以使用pickResult API。为此提供了一个教程:

但是,出于您的目的,仅需要一个不查询选择结果的简单单击处理程序即可。

© www.soinside.com 2019 - 2024. All rights reserved.