我在XY线图上绘制了一个简单的系列,如下所示
public class SimpleXYLineChart extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Line plot");
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis(1, 22, 0.5);
yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis){
@Override
public String toString(Number object){
return String.format("%7.2f", object);
}
});
final LineChart<String, Number>lineChart = new LineChart<String, Number>(xAxis, yAxis);
lineChart.setCreateSymbols(false);
lineChart.setAlternativeRowFillVisible(false);
lineChart.setLegendVisible(false);
lineChart.setTitle("LineChart");
XYChart.Series series1 = new XYChart.Series();
series1.getData().add(new XYChart.Data("Jan", 1));
series1.getData().add(new XYChart.Data("Feb", 1.5));
series1.getData().add(new XYChart.Data("Mar", 2));
series1.getData().add(new XYChart.Data("Apr", 2.5));
series1.getData().add(new XYChart.Data("May", 3));
series1.getData().add(new XYChart.Data("Jun", 4));
series1.getData().add(new XYChart.Data("Jul", 6));
series1.getData().add(new XYChart.Data("Aug", 9));
series1.getData().add(new XYChart.Data("Sep", 12));
series1.getData().add(new XYChart.Data("Oct", 15));
series1.getData().add(new XYChart.Data("Nov", 20));
series1.getData().add(new XYChart.Data("Dec", 22));
lineChart.getData().addAll(series1);
Scene scene = new Scene(new Group(), 800, 600);
final VBox vbox = new VBox();
final HBox hbox = new HBox();
final Button remove = new Button("Remove Series");
remove.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
if (!lineChart.getData().isEmpty()){
System.out.println("Remove Series");
lineChart.getData().remove((lineChart.getData().size()-1),0);
}
}
});
hbox.setSpacing(10);
hbox.getChildren().addAll(remove);
vbox.getChildren().addAll(lineChart, hbox);
hbox.setPadding(new Insets(10, 10, 10, 50));
((Group)scene.getRoot()).getChildren().add(vbox);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我想删除绘制的线条(通过点击按钮或标记一个复选框)并将空场景如下所示
我不知道如何在绘制后删除Line,没有找到任何.remove()或.delete()方法。
如何做到这一点?
由于
答案 0 :(得分:7)
问题现在解决了,似乎是JavaFX的一个bug。
我已经通过添加
解决了lineChart.setAnimated(假);这一切都很好。在JIRA Kenai中,它通过注释lineChart.setCreateSymbols(false)被提议为bug;
这也有效,但我认为这不是正确的答案,我可以使用.setCreateSymbols(false)或(true)设置setAnimated(false);
答案 1 :(得分:2)
我遇到了同样的问题并做了一个解决方法。为了概述,我管理了一个包含所有系列的ArrayList。每次应该从图表中删除其中一个系列,我在ArrayList中搜索它并清除该系列的数据(清除,不删除,数据对于保持颜色很重要)。
final ArrayList<XYChart.Series> serieslist = new ArrayList<>();
--removing--
if(series to remove found){
serieslist.get(i).getData().clear();
addSeries(serieslist);
}
--adding--
XYChart.Series series = new XYChart.Series();
series.getData().add(SERIESDATA);
if(series to add found at i in serieslist){
serieslist.set(i, series);
addSeries(serieslist);
}
else {
serieslist.add(series);
addSeries(serieslist);
}
--method addSeries--
addSeries(ArrayList<XYChart.Series> serieslist) {
chart.getData().clear();
for (int i = 0; i < serieslist.size(); i++) {
chart.getData().add(serieslist.get(i));
}
}
我希望这就是你要找的东西。
编辑:一个问题仍然没有解决。当我从图表中删除一个系列时,该系列的名称/描述在图例中保持可见。我的解决方案是禁用图例并为我决定以相应颜色显示/删除系列的按钮着色。可以从线图的默认样式表(caspian.css)中提取颜色。它只为系列定义了8种颜色。为方便起见,他们是:
.default-color0.chart-series-line { -fx-stroke: #f9d900; }
.default-color1.chart-series-line { -fx-stroke: #a9e200; }
.default-color2.chart-series-line { -fx-stroke: #22bad9; }
.default-color3.chart-series-line { -fx-stroke: #0181e2; }
.default-color4.chart-series-line { -fx-stroke: #2f357f; }
.default-color5.chart-series-line { -fx-stroke: #860061; }
.default-color6.chart-series-line { -fx-stroke: #c62b00; }
.default-color7.chart-series-line { -fx-stroke: #ff5700; }
答案 2 :(得分:1)
你的系列是一个ObservableList
,你可以随意使用该列表做任何事情,并且会反映出来。
,例如,在您的情况下:
series1.getData().clear();