【发布时间】:2019-08-09 10:20:03
【问题描述】:
这是接口代码:
@Override
public void start(Stage primaryStage){
NumberAxis xAxis = new NumberAxis();
xAxis.setLabel("XX");
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("YY");
LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setLegendVisible(false);
XYChart.Series<Number, Number> series1 = new XYChart.Series<>();
series1.setName("Line1");
series1.getData().add(new XYChart.Data<>(1, 1));
series1.getData().add(new XYChart.Data<>(2, 2));
series1.getData().add(new XYChart.Data<>(3, 2));
series1.getData().add(new XYChart.Data<>(4, 1));
XYChart.Series<Number, Number> series2 = new XYChart.Series<>();
series2.setName("Line2");
series2.getData().add(new XYChart.Data<>(2, 2));
series2.getData().add(new XYChart.Data<>(3, 2));
series2.getData().add(new XYChart.Data<>(4, 2));
XYChart.Series<Number, Number> series3 = new XYChart.Series<>();
series3.setName("Line3");
series3.getData().add(new XYChart.Data<>(1, 3));
series3.getData().add(new XYChart.Data<>(2, 2));
series3.getData().add(new XYChart.Data<>(3, 1));
series3.getData().add(new XYChart.Data<>(3, 2));
List<XYChart.Series<Number, Number>> seriesList = Arrays.asList(series1, series2, series3);
lineChart.getData().addAll(seriesList);
HBox legendBox = new HBox();
legendBox.setStyle("-fx-alignment: center; -fx-padding: 10;");
Insets insets = new Insets(0, 10, 0, 10);
for(Node legend : lineChart.lookupAll(".chart-legend-item")){
Label label = (Label)legend;
label.setOnMouseClicked(e -> {
XYChart.Series<Number, Number> toFront = seriesList.stream()
.filter(e1 -> e1.getName().equals(label.getText()))
.findFirst().get();
System.out.println(toFront);
//put series toFront over all other series
//i don't know how//
/*I have tried this
Platform.runLater(() -> {
lineChart.getData().remove(toFront);
lineChart.getData().add(toFront); //first time click: Duplicate, after only NullPointer
});*/
});
legendBox.getChildren().add(label);
HBox.setMargin(label, insets);
}
BorderPane borderPane = new BorderPane();
borderPane.setCenter(lineChart);
borderPane.setBottom(legendBox);
primaryStage.setScene(new Scene(borderPane));
primaryStage.sizeToScene();
primaryStage.centerOnScreen();
primaryStage.show();
}
界面是这样的:
正如您在图片中看到的,您无法知道Line1 和Line2 的确切路径。
我想在图例上加上EventHandler。当您单击其中一个图例时,将图例线放在图表前面,覆盖所有其他线。
如您所见,带有EventHandler 的代码已写入。确定系列后,我不知道该怎么办。我试图从图表中删除并再次添加:
Platform.runLater(() -> {
lineChart.getData().remove(toFront);
lineChart.getData().add(toFront);
});
仅删除行和结果错误:
1. First click: "Duplicate series added" //at line with add
2. Next clicks: "NullPointerException" //at line with add
【问题讨论】:
-
我相信这些线/点都是在同一个父节点中绘制的,这意味着您可以尝试设置该系列的节点的view order 以及该系列中每个数据的节点。跨度>
-
但是我如何找到父节点?
-
Node有一个parent属性。但是,您不需要父节点。查看顺序应在Series#node属性和每个Data#node属性中的Node上设置(在所说的Series中)。注意我还没有尝试过,所以如果你发现它不起作用,请告诉我。 -
@Slaw
toFront.getNode().setViewOrder(10);-toFront.getData().forEach(e1 -> e1.getNode().setViewOrder(10));- 发生了一些事情,但这不是我想要的,我也不太明白发生了什么,因为有时把它放回去,有时什么也没发生。你能帮我写代码吗?如果你有时间。 -
@Slaw 我找到了。
toFront()有一个方法Node有它。感谢您的时间。同样首先我理解错误setViewOrder使用。我以为它设置了z-coord。实际上它就像在数组中使用索引一样(较低的值表示第一个元素)。