- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个拖放应用程序,用户可以将新的“组件”拖放到 Canvas 上,然后拖动它们。这是我用来实现此目的的代码:
在 CanvasController 类中
canvas.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
// Create new component
ComponentController component = new ComponentController();
// Add the component to the canvas
canvas.getChildren().add(component);
// Relocate the component to the mouse location
component.relocateToPointInScene(new Point2D(event.getSceneX(),event.getSceneY()));
// Make the component visible
component.setVisible(true);
// Set drop complete
event.setDropCompleted(true);
// Consume event
event.consume();
}
}
在 ComponentController 类中
protected final void relocateToPointInScene(Point2D scenePoint) {
// Create a point in the parent (canvas) copordinates
Point2D parentPoint = getParent().sceneToLocal(scenePoint);
// Locate the node so that its centre is located at the parent point
this.relocate((int) (parentPoint.getX() - (widthProperty().getValue()/2.0)), (int) (parentPoint.getY() - heightProperty().getValue()/2.0));
}
从功能上讲,它工作正常,但新组件没有放置在 Canvas 上的正确位置 - 它的位置应该使组件的中心位于鼠标位置,但它被放下,以便顶部左上角位于鼠标位置。
我发现这是因为当调用 relocateToPointInScene(Point2D scenePoint)
时,新组件的 widthProperty() 和 heightProperty() 值仍然为零。如果我重新拾起组件,再次将其拖放,代码将按预期工作,因为现在 widthProperty() 和 heightProperty() 不为零。
canvas.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
// Relocate the component to the mouse location
component.relocateToPointInScene(new Point2D(event.getSceneX(),event.getSceneY()));
}
}
所以我的问题是:
为什么在 drop 函数中调用时 widthProperty() 和 heightProperty() 仍然为零? - 此时,对象已被构造、初始化并添加到父级( Canvas ),因此我不明白为什么不应设置这些值。
第一次和第二次调用 relocateToPointInScene(Point2D scenePoint)
来更改这些值之间发生了什么。
最佳答案
正如 Slaw 所建议的,在将组件添加为子组件之后,但在重新定位它之前,调用 canvas.applyCss()
,然后调用 canvas.layout()
即可达到目的.
关于JavaFX - widthProperty() 和 heightProperty() 何时设置/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762442/
我正在开发一个 javaFX 项目,在该项目中我需要精确控制 Node 的大小。我的代码当前在需要时正确更新 prefWidthProperty,并且最小和最大尺寸设置为使用 pref 尺寸,但 wi
我使用Pane通过将一些Label添加到其子列表中来打印它们。由于某种原因,我需要绑定(bind)标签宽度,但是当我执行以下操作时: public class LabelTestApp extends
我正在尝试实现一个拖放应用程序,用户可以将新的“组件”拖放到 Canvas 上,然后拖动它们。这是我用来实现此目的的代码: 在 CanvasController 类中 canvas.setOnDrag
我想在 BorderPane 中间放置一个带有红色矩形的 HBox,并且我希望该矩形随其容器( H盒)。这是我的代码: public class Test extends Application {
我有一个 TabPane,其中包含两个 Tab,并在 FXML 中设置。初始化时,我动态地将 AnchorPane 添加到 Tab 之一。然后,我将 ListView 设置为 AnchorPane 的
我是一名优秀的程序员,十分优秀!