- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 JavaFX 的坐标系。
对于某些节点(形状?),例如 Line
或 矩形
,我可以(或应该)在坐标系中指定 x 和 y 值。
这到底是什么?这是稍后附加到节点的平移和拉伸(stretch)还是其他内容?其他节点只有一个 setLayoutX()
方法,而例如Line
具有 setLayoutX()
和 setStartX()
。
谢谢!
最佳答案
每个Node
有两个不同的边界属性(忽略 Node#layoutBounds
),与两个不同的坐标空间(本地坐标空间和父坐标空间)相关。
The rectangular bounds of this
Node
in the node's untransformed local coordinate space. For nodes that extendShape
, the local bounds will also include space required for a non-zero stroke that may fall outside the shape's geometry that is defined by position and size attributes. The local bounds will also include any clipping set withclip
as well as effects set witheffect
.[...]
The rectangular bounds of this
Node
which include its transforms.boundsInParent
is calculated by taking the local bounds (defined byboundsInLocal
) and applying the transform created by setting the following additional variables
transforms
ObservableListscaleX
,scaleY
,scaleZ
rotate
layoutX
,layoutY
translateX
,translateY
,translateZ
The resulting bounds will be conceptually in the coordinate space of theNode
's parent, however the node need not have a parent to calculate these bounds.[...]
这意味着诸如layoutX
之类的属性和translateX
只影响父级边界。基本上,父级边界只是应用了各种转换的本地边界。但说到“特别”Shape
属性,例如 x
和y
Rectangle
的属性,它们直接影响本地边界。我无法找到解释这一点的文档,尽管也许我只是错过了它,或者这种行为对于那些“知情者”来说应该是显而易见的。不幸的是,我无法向您解释为什么这些 Shape
属性直接影响本地边界,因为我缺乏这方面的基础知识。
也就是说,我可以通过以下示例直观地演示有关本地边界的差异:
App.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class App extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
var root = FXMLLoader.<Parent>load(getClass().getResource("App.fxml"));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
Controller.java
import javafx.fxml.FXML;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Rectangle;
public class Controller {
@FXML
private void handleMousePressed(MouseEvent event) {
event.consume();
var source = (Node) event.getSource();
source.setUserData(source.localToParent(event.getX(), event.getY()));
}
@FXML
private void handleMouseDragged(MouseEvent event) {
event.consume();
var source = (Node) event.getSource();
var lastPoint = (Point2D) source.getUserData();
var nextPoint = source.localToParent(event.getX(), event.getY());
source.setTranslateX(source.getTranslateX() + nextPoint.getX() - lastPoint.getX());
source.setTranslateY(source.getTranslateY() + nextPoint.getY() - lastPoint.getY());
source.setUserData(nextPoint);
}
@FXML
private void handleMouseReleased(MouseEvent event) {
event.consume();
var source = (Node) event.getSource();
if (source instanceof Rectangle) {
var rectangle = (Rectangle) source;
rectangle.setX(rectangle.getX() + rectangle.getTranslateX());
rectangle.setTranslateX(0);
rectangle.setY(rectangle.getY() + rectangle.getTranslateY());
rectangle.setTranslateY(0);
}
source.setUserData(null);
}
}
App.fxml
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.shape.Rectangle?>
<?import javafx.scene.text.Font?>
<HBox xmlns="http://javafx.com/javafx/12.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller"
prefWidth="1000" prefHeight="600" spacing="15">
<fx:define>
<Font fx:id="titleFont" name="Impact" size="24"/>
<Color fx:id="inLocalColor" fx:value="LIME"/>
<Color fx:id="inParentColor" fx:value="RED"/>
</fx:define>
<padding>
<Insets topRightBottomLeft="25"/>
</padding>
<VBox HBox.hgrow="ALWAYS" spacing="10" alignment="CENTER">
<Label text="SHAPE" font="$titleFont"/>
<Separator/>
<Pane fx:id="shapePane" VBox.vgrow="ALWAYS">
<clip>
<Rectangle x="-5" y="-5" width="${shapePane.width}" height="${shapePane.height}"/>
</clip>
<Pane managed="false">
<Rectangle fx:id="shape" width="100" height="100" managed="false" onMousePressed="#handleMousePressed"
onMouseDragged="#handleMouseDragged" onMouseReleased="#handleMouseReleased"/>
<Rectangle fill="TRANSPARENT" stroke="$inLocalColor" strokeType="INSIDE" strokeWidth="2"
mouseTransparent="true" x="${shape.boundsInLocal.minX}" y="${shape.boundsInLocal.minY}"
width="${shape.boundsInLocal.width}" height="${shape.boundsInLocal.height}"/>
<Rectangle fill="TRANSPARENT" stroke="$inParentColor" strokeType="OUTSIDE" strokeWidth="2"
mouseTransparent="true" x="${shape.boundsInParent.minX}" y="${shape.boundsInParent.minY}"
width="${shape.boundsInParent.width}" height="${shape.boundsInParent.height}"/>
</Pane>
</Pane>
</VBox>
<Separator orientation="VERTICAL"/>
<VBox HBox.hgrow="ALWAYS" spacing="10" alignment="CENTER">
<Label text="NON-SHAPE" font="$titleFont"/>
<Separator/>
<Pane fx:id="nonShapePane" VBox.vgrow="ALWAYS">
<clip>
<Rectangle x="-5" y="-5" width="${nonShapePane.width}" height="${nonShapePane.height}"/>
</clip>
<Pane managed="false">
<Region fx:id="nonShape" prefWidth="100" prefHeight="100" style="-fx-background-color: black;"
onMousePressed="#handleMousePressed" onMouseDragged="#handleMouseDragged"
onMouseReleased="#handleMouseReleased"/>
<Rectangle fill="TRANSPARENT" stroke="$inLocalColor" strokeType="INSIDE" strokeWidth="2"
mouseTransparent="true" x="${nonShape.boundsInLocal.minX}" y="${nonShape.boundsInLocal.minY}"
width="${nonShape.boundsInLocal.width}" height="${nonShape.boundsInLocal.height}"/>
<Rectangle fill="TRANSPARENT" stroke="$inParentColor" strokeType="OUTSIDE" strokeWidth="2"
mouseTransparent="true" x="${nonShape.boundsInParent.minX}"
y="${nonShape.boundsInParent.minY}" width="${nonShape.boundsInParent.width}"
height="${nonShape.boundsInParent.height}"/>
</Pane>
</Pane>
</VBox>
</HBox>
运行上述结果:
红色轮廓是节点的父级边界,而绿色轮廓是节点的本地边界。拖动节点时,位置会通过 translate[X|Y]
更新。属性,对于形状和非形状,不影响局部边界。但对于形状,当释放鼠标时,平移变换将复制到“形状属性”(即 Rectangle.x
和 Rectangle.y
),然后平移属性将重置为 0
。这显示了对于形状,局部边界可能具有与 (0,0)
不同的原点。 .
事实是Shape
改变其本地边界会对诸如转换之类的事情产生影响。例如,如果您想使用 Rotate
绕其中心旋转节点。 ,那么形状的枢轴点与非形状的枢轴点将不同:
形状(例如 Rectangle
):(x + width / 2, y + height / 2)
1
非形状(例如 Region
):(width / 2, height / 2)
2
受影响的另一件事是您从 MouseEvent
获得的本地鼠标坐标。 .
1。注意 Circle
等形状您可以简单地使用centerX
和centerY
。对于 Circle
来说,这是一个有趣的结果是本地边界将具有负最小值。
2.从技术上讲,这里唯一的区别是 x
和y
已知为0
.
关于java - 为什么有些节点有 x 和 y 位置而其他节点没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751706/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!