我目前正在使用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);
});
如何选择节点
“如何区分正在点击的圆柱体,以便可以对特定圆柱体进行更改?”
您没有,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。为此提供了一个教程:
但是,出于您的目的,仅需要一个不查询选择结果的简单单击处理程序即可。