stage.show() 命令更改 Bounds [duplicate] 的值

stage.show() command changes value of Bounds [duplicate]

提问人:Mostafa Ayaz 提问时间:11/17/2023 最后编辑:Mostafa Ayaz 更新时间:11/17/2023 访问量:40

问:

我正在用 JavaFX 编写一个应用程序。我希望能够在运行应用程序期间向 a 添加 s 并与他们的孩子一起工作。ChartSceneBounds.chart-plot-background

请考虑以下两个代码片段及其输出:

代码 1

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
public class Test8 extends Application {
    @Override
    public void start(Stage stage) {

        AnchorPane anchorPane=new AnchorPane();

        Scene scene=new Scene(anchorPane,600,400);

        stage.setScene(scene);

        stage.show();

        LineChart<Number,Number> lineChart=new LineChart<>(new NumberAxis(),new NumberAxis());

        Region region= (Region) lineChart.lookup(".chart-plot-background");

        anchorPane.getChildren().add(lineChart);

        System.out.println(region.getBoundsInParent());

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


}

输出:BoundingBox [minX:0.0, minY:0.0, minZ:0.0, width:0.0, height:0.0, depth:0.0, maxX:0.0, maxY:0.0, maxZ:0.0]

代码 2

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
public class Test8 extends Application {
    @Override
    public void start(Stage stage) {

        AnchorPane anchorPane=new AnchorPane();

        Scene scene=new Scene(anchorPane,600,400);

        stage.setScene(scene);

        LineChart<Number,Number> lineChart=new LineChart<>(new NumberAxis(),new NumberAxis());

        Region region= (Region) lineChart.lookup(".chart-plot-background");

        anchorPane.getChildren().add(lineChart);

        stage.show();

        System.out.println(region.getBoundsInParent());

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


}

输出:BoundingBox [minX:38.0, minY:10.0, minZ:0.0, width:443.0, height:346.0, depth:0.0, maxX:481.0, maxY:356.0, maxZ:0.0]

这两个代码段之间的唯一区别是命令的位置。stage.show()

问题

我应该如何修复代码 1,以便在执行后将子命令添加到时输出有效结果?anchorPanestage.show()region.getBoundsInParent()

爪哇 JavaFX

评论

0赞 James_D 11/17/2023
除非我遗漏了什么,否则你已经发布了两次完全相同的两段代码。无论如何,查找然后手动获取区域边界的整个组合几乎可以肯定,无论您要做什么,都是错误的方法。
0赞 jewelsea 11/17/2023
首次在舞台上调用将应用 CSS 并生成布局阶段,该阶段设置所有节点的大小。如果要手动应用 CSS 并生成布局传递,请参阅副本中有关如何执行此操作的信息。show()
1赞 James_D 11/17/2023
请注意,副本显示了如何做你真正要求的事情,但几乎可以肯定的是,这首先不是正确的事情。为什么需要绘图区域的边界?如果要向绘图区域添加节点或在绘图区域中定位节点,则支持的方法是子类化和覆盖。您可以使用,例如 以查找节点相对于轴值的适当布局位置。这似乎是一个 XY 问题LineChartlayoutPlotChildren()getDisplayPosition()
0赞 James_D 11/17/2023
请参阅 stackoverflow.com/a/38885893/2189127,这可能是解决您实际尝试做的任何事情的更好方法。
0赞 Mostafa Ayaz 11/17/2023
@James_D,我很抱歉。我注意到我为代码 1 和代码 2 复制了相同的代码片段。我需要绘图区域边界的原因是问题的一部分,即如何找到图表组件(例如绘图区域、x 轴、y 轴、刻度线、刻度标签等)的相对位置以及图表本身的边界?例如,我想知道是否可以计算图表边界的绘图区域(或 x 轴)的大小和位置。

答:

1赞 SedJ601 11/17/2023 #1

我不知道我是否真的正确地理解了这个问题,但如果我真的理解了,我会使用或类似的东西。setOnMouseEntered

例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
public class App extends Application {
    @Override
    public void start(Stage stage) {

        AnchorPane anchorPane=new AnchorPane();

        Scene scene=new Scene(anchorPane,600,400);

        stage.setScene(scene);

        LineChart<Number,Number> lineChart=new LineChart<>(new NumberAxis(),new NumberAxis());
        anchorPane.getChildren().add(lineChart);
        lineChart.setOnMouseEntered((event) -> {
            Region region= (Region) lineChart.lookup(".chart-plot-background");
           
            System.out.println(region.getBoundsInParent());
        });
        
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
}

评论

0赞 Mostafa Ayaz 11/17/2023
这是一个有趣的方法和观点。在我的应用程序中,鼠标仍然可能永远不会进入折线图,并且 setOnMouseEntered 方法永远不会运行。
2赞 jewelsea 11/17/2023
@MostafaAyaz您需要更好地提供有关原始问题中的约束和操作和要求的信息,以便您能够获得相关答案。