Layout JavaFX面积图和在光标后添加动态标签

Layout JavaFX面积图和在光标后添加动态标签,layout,charts,javafx,Layout,Charts,Javafx,我希望能够在光标后面的图表中添加标签。我已经看到了几个堆栈溢出的例子,它们将标签附加到一个系列的值/节点上,但我希望能够对整个面积图执行此操作。当我想添加一个标签(最终是一个浮动的值框)时,我的问题就来了。我正在努力想办法做到这一点并保持场景的布局。当我将图表作为专用项添加到场景中时,图表将按预期进行渲染。但是,当我将标签添加到场景中时,它将被共享,图表不再填充整个画布 Group root = new Group(); root.getChildren().addAll(sac,myLabel

我希望能够在光标后面的图表中添加标签。我已经看到了几个堆栈溢出的例子,它们将标签附加到一个系列的值/节点上,但我希望能够对整个面积图执行此操作。当我想添加一个标签(最终是一个浮动的值框)时,我的问题就来了。我正在努力想办法做到这一点并保持场景的布局。当我将图表作为专用项添加到场景中时,图表将按预期进行渲染。但是,当我将标签添加到场景中时,它将被共享,图表不再填充整个画布

Group root = new Group();
root.getChildren().addAll(sac,myLabel);
Scene scene = new Scene(root, 800, 600); // Now the Chart shares the scene with the label
我想添加标签,以便在鼠标移动到图表上时使用它,然后简单地将其转换到光标位置。我对鼠标事件没有问题,只是我似乎无法与瞬间的对象共享场景。我相信这是因为对如何处理这种特殊情况缺乏了解。这个问题的解决方案很可能是动态生成此标签,而不是将其作为静态场景对象。感谢您的帮助

下面是完整的测试用例(Java8)

导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.StackedAreaChart;
导入javafx.scene.chart.XYChart;
导入javafx.scene.control.Label;
导入javafx.scene.input.MouseEvent;
导入javafx.stage.stage;
公共类AreaChartTestCase扩展了应用程序{
最终数字xis xAxis=新数字xis(1,31,1);
最终数字axis yAxis=新数字axis();
最终堆垛法
=新StackedAreaChart(xAxis,yAxis);
标签myLabel=新标签();
@凌驾
公众假期开始(阶段){
阶段。设置标题(“面积图样本”);
sac.setTitle(“温度监测(摄氏度)”);
XYChart.系列系列四月份
=新的XYChart.Series();
序列四月集名(“四月”);
seriesApril.getData().add(新的XYChart.Data(1,4));
seriesApril.getData().add(新的XYChart.Data(3,10));
seriesApril.getData().add(新的XYChart.Data(6,15));
seriesApril.getData().add(新的XYChart.Data(9,8));
seriesApril.getData().add(新的XYChart.Data(12,5));
seriesApril.getData().add(新的XYChart.Data(15,18));
seriesApril.getData().add(新的XYChart.Data(18,15));
seriesApril.getData().add(新的XYChart.Data(21,13));
seriesApril.getData().add(新的XYChart.Data(24,19));
seriesApril.getData().add(新的XYChart.Data(27,21));
seriesApril.getData().add(新的XYChart.Data(30,21));
XYChart.系列系列系列可能
=新的XYChart.Series();
seriesMay.setName(“五月”);
seriesMay.getData().add(新的XYChart.Data(1,20));
seriesMay.getData().add(新的XYChart.Data(3,15));
seriesMay.getData().add(新的XYChart.Data(6,13));
seriesMay.getData().add(新的XYChart.Data(9,12));
seriesMay.getData().add(新的XYChart.Data(12,14));
seriesMay.getData().add(新的XYChart.Data(15,18));
seriesMay.getData().add(新的XYChart.Data(18,25));
seriesMay.getData().add(新的XYChart.Data(21,25));
seriesMay.getData().add(新的XYChart.Data(24,23));
seriesMay.getData().add(新的XYChart.Data(27,26));
seriesMay.getData().add(新的XYChart.Data(31,26));
最终节点chartPlotBackground=sac.lookup(“.chart plot background”);
chartPlotBackground.SetonMouseCentered((MouseEvent MouseEvent)->{
myLabel.setVisible(true);
});
chartPlotBackground.setOnMouseExited((MouseEvent MouseEvent)->{
myLabel.setVisible(假);
});
chartPlotBackground.setOnMouseMoved((MouseEvent MouseEvent)->{
myLabel.setText(“位置:X=“+mouseEvent.getSceneX()+”:Y=“+mouseEvent.getSceneY());
myLabel.setTranslateX(mouseEvent.getSceneX());
myLabel.setTranslateY(mouseEvent.getSceneY());
});
组根=新组();
root.getChildren().addAll(sac,myLabel);
Scene Scene=新场景(root,800600);//现在图表与标签共享场景
sac.getData().addAll(seriesApril,seriesMay);
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

所以我想我已经解决了。至少达到了我的要求

    Group root = new Group();
    root.setManaged(false);
    root.getChildren().add(ac);
    root.getChildren().add(myLabel);
    Scene scene = new Scene(root);

    scene.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth, Number newSceneWidth) {
            ac.setPrefWidth((double) newSceneWidth);
        }
    });
    scene.heightProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight, Number newSceneHeight) {
            ac.setPrefHeight((double) newSceneHeight);
        }
    });
组根=新组();
root.setManaged(false);
root.getChildren().add(ac);
root.getChildren().add(myLabel);
场景=新场景(根);
scene.widthProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(ObservableValue在示例中,您的标签取决于
mouseEvent.getSceneX/Y
值,这似乎不是特别有用。这是您真正想要的吗?还是希望标签取决于某个图表特定的值?如果是,它与鼠标悬停的区域或鼠标所处的确切点有关?感谢您的帮助回答。老实说,跟踪鼠标只是为了演示我正在尝试做的事情。我很确定我可以做到这一点。真正的问题是,我不知道如何将标签添加到场景中,然后应用布局,使图表在窗口/画布中最大化,并且标签不绑定到特定的布局区域。基本上我的问题比这更根本……一个团队让我能够做到这一点,但似乎我无法将图表最大化。
    Group root = new Group();
    root.setManaged(false);
    root.getChildren().add(ac);
    root.getChildren().add(myLabel);
    Scene scene = new Scene(root);

    scene.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth, Number newSceneWidth) {
            ac.setPrefWidth((double) newSceneWidth);
        }
    });
    scene.heightProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight, Number newSceneHeight) {
            ac.setPrefHeight((double) newSceneHeight);
        }
    });