当前位置: 首页 > 知识库问答 >
问题:

JavaFX:节点的坐标没有明显的原因是错误的

井翰
2023-03-14

我正在尝试在JavaFX中可视化一个图形。节点应该是交互式的。目前我有一个VBox,并根据我在图形中需要的级别将尽可能多的HBox放入其中。所有HBox都设置为将其子节点定位为中心。子节点代表单个节点,是按钮。VBox本身被放置在StackPane中,Canvas作为StackPane的另一个子节点。然后将此StackPane放置到场景中。我想使用Canvas来绘制节点之间的连接边缘。要获取我使用的节点的坐标:

System.out.println(button.localToScene(button.getBoundsInLocal().getMinX(),
button.getBoundsInLocal().getMinY()));

但无论按钮位于何处,结果坐标仍为:

Point2D [x = 0.0, y = 108.0]

所有的按钮。虽然显示正确,但每个按钮显然都有相同的坐标!

请帮帮我,我现在很绝望。。。

编辑:

下面是最简单的例子:

Main.java

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
    VBox root = new VBox();
    HBox buttons = new HBox();
    TabPane tabs = new TabPane();
    buttons.getChildren().addAll(
            new Button("1"),
            new Button("2"),
            new Button("3"));
    tabs.getTabs().addAll(
            new TabBoxes("____A____"),
            new TabBoxes("____B____"),
            new TabBoxes("____C____")
    );
    root.getChildren().addAll(buttons, tabs);
    primaryStage.setScene(new Scene(root, 500, 400));
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}
}

TabBoxes.java

public class TabBoxes extends Tab {
private VBox vBox = new VBox();
private ArrayList<HBox> hBoxes;
private Canvas canvas = new Canvas();
private StackPane stack = new StackPane();
private static final int V_INIT_SPACING = 60;
private static final int V_SPACING = 60;
private static final int H_SPACING = 60;

TabBoxes(String s){
    super(s);
    this.html" target="_blank">setContent(stack);
    setClosable(false);
    stack.getChildren().add(canvas);
    stack.getChildren().add(vBox);
    canvas.setWidth(2000);
    canvas.setHeight(1080);
    hBoxes = new ArrayList<>();
    vBox.setSpacing(V_SPACING);
    vBox.translateYProperty().set(V_INIT_SPACING);
    for (int i = 0; i < 5; i++) {
        hBoxes.add(new HBox() {
            {
                setSpacing(H_SPACING);
                setAlignment(Pos.CENTER);
            }
        });
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j <= i; j++) {
            hBoxes.get(i).getChildren().add(new Button(i + "||" + j){
                {
                    setPrefSize(100,60);
                    setOnAction(e-> System.out.println("My coordinates are: " + localToScene(getBoundsInLocal().getMinX(),getBoundsInLocal().getMinY())));
                }
            });
        }
    }
    vBox.getChildren().addAll(hBoxes);

}
}

共有1个答案

钱华晖
2023-03-14

< code>boundsInLocal是< code >按钮自己的坐标系中的坐标。这些值是相同的,这并不奇怪。< br >如果要计算< code>Canvas坐标系中的坐标,请将坐标转换为< code>StackPane坐标,然后将坐标转换为< code>Canvas坐标:

Node n = button;
Point2D p = new Point2D(button.getBoundsInLocal().getMinX(), button.getBoundsInLocal().getMinY());
while (n != stackPane) {
     p = n.localToParent(p);
     n = n.getParent();
}

p = canvas.parentToLocal(p);
 类似资料:
  • 问题内容: 我使用boto3连接到AWS的代码遇到错误。该错误仅在昨天下午开始,在上一次我没有收到错误和第一次我得到错误之间,我看不到任何变化。 错误是: 在.aws / config中,我有: 这是我所知道的: 在另一台机器上使用相同的AWS凭证和配置,我看不到错误。 在同一台计算机上使用不同的AWS凭证和配置,我确实看到了错误。 我是我们小组中唯一在任何计算机上出现任何凭据问题的人。 我不认为

  • 我试图找出鼠标在哪里,就GridPane的列和行而言。我知道鼠标的位置,所以如果我知道每个单元格的宽度和高度(我认为这不是一个简单的方法来计算),我大概可以从中算出它,但是我看到的大多数代码似乎都假设鼠标在一个节点上GridPane内部: 但是实际上我的GridPane里面没有任何东西,所以我只得到整个GridPane。现在,我想我可以为每个单元添加节点,但这似乎效率低下。(这个想法是用户将节点放

  • 问题内容: 我发现(0,0)映射到屏幕的左上角有点不直观。在Java Swing中使用左手坐标系是否有历史原因? 虽然将其映射到右手系统并不难,但我很好奇,知道使用左手系统是否有任何隐藏的好处。 问题答案: 根据这篇文章,这仅仅是因为这是电视机一直使用的方式(BTW并没有改变)。因此,这个早期的设计决策似乎今天仍然会产生影响。 早期的家用计算机通常连接到电视,因此自然会使用此坐标系。我猜想很多显示

  • 问题内容: 我偶尔会看到像这样的Python代码中使用的列表切片语法: 当然,这与以下内容相同: 还是我错过了什么? 问题答案: 就像NXC所说的,Python变量名实际上指向一个对象,而不是内存中的特定位置。 会创建两个指向同一对象的不同变量,因此,更改也会更改。 但是,当您这样做时,它将“切片”列表,并创建一个新列表。的默认值为0,并且位于列表的末尾,因此它将复制所有内容。因此,它使用第一个中

  • 我们在Azure应用程序服务计划中遇到CPU峰值,没有明显的原因。这并不是停止服务的原因,但我们想知道什么时候 例如,CPU百分比连续几天保持在0-1%的范围内,但突然它飙升到98%, 45%, 60%并很快回到0-1%的范围内。内存保持在舒适的40-45%水平不变,没有传入请求,没有Web作业,日志中没有异常,没有故障,服务健康正常,没有我们可以指出的原因。我们试图通过kudu找到答案 该应用程

  • 我的代码: 打印: 我的问题是:当我得到btn1的坐标时,MinX和MinY是0,我能理解。但对于btn2,MinY不应为0;MaxX和MaxY也不应该是0。那么,如何在VBox中获取按钮左角的真实坐标呢。为了清楚起见,我需要节点相对于VBox的坐标。谢谢