Charts javafx2.x:如何删除绘制后的XY折线图?

Charts javafx2.x:如何删除绘制后的XY折线图?,charts,plot,line,javafx-2,Charts,Plot,Line,Javafx 2,我在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

我在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);
}   
公共类SimpleXYLineChart扩展应用程序{
@凌驾
公众假期开始(阶段){
舞台布景标题(“线条图”);
最终CategoryAxis xAxis=新CategoryAxis();
最终数字轴yAxis=新数字轴(1,22,0.5);
yAxis.setTickLabelFormatter(新编号Axis.DefaultFormatter(yAxis){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.2f”,对象);
}
});
最终线形图线形图=新线形图(xAxis,yAxis);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
线形图。setLegendVisible(假);
线形图。设置标题(“线形图”);
XYChart.Series系列1=新的XYChart.Series();
series1.getData().add(新的XYChart.Data(“Jan”,1));
series1.getData().add(新的XYChart.Data(“Feb”,1.5));
series1.getData().add(新的XYChart.Data(“Mar”,2));
series1.getData().add(新的XYChart.Data(“Apr”,2.5));
series1.getData().add(新的XYChart.Data(“May”,3));
series1.getData().add(新的XYChart.Data(“Jun”,4));
series1.getData().add(新的XYChart.Data(“Jul”,6));
series1.getData().add(新的XYChart.Data(“Aug”,9));
series1.getData().add(新的XYChart.Data(“Sep”,12));
series1.getData().add(新的XYChart.Data(“Oct”,15));
series1.getData().add(新的XYChart.Data(“Nov”,20));
series1.getData().add(新的XYChart.Data(“Dec”,22));
lineChart.getData().addAll(series1);
场景=新场景(新组(),800600);
最终VBox VBox=新的VBox();
最终HBox HBox=新HBox();
最终按钮移除=新按钮(“移除系列”);
remove.setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent e){
如果(!lineChart.getData().isEmpty()){
System.out.println(“删除系列”);
lineChart.getData().remove((lineChart.getData().size()-1),0);
}
}
});                
hbox.setspace(10);
hbox.getChildren().addAll(移除);
vbox.getChildren().addAll(折线图,hbox);
hbox.设置填充(新插图(10,10,10,50));
((组)scene.getRoot()).getChildren().add(vbox);
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}   
}

我想删除绘制的线(通过单击按钮或标记复选框),并获得如下所示的空场景

我不知道如何删除绘制后的线条,没有找到任何.remove()或.delete()方法

如何做到这一点


谢谢

您的系列是一个
可观察列表
,您可以使用该列表做任何您想做的事情,它将得到反映

例如,在您的情况下:

    series1.getData().clear();

问题现在解决了,似乎是JavaFX的一个bug

我通过添加

线形图。设置动画(假);一切都很好。在JIRA Kenai中,通过注释lineChart.setCreateSymbles(false),它被认为是bug


这同样有效,但我认为这不是正确的答案,我可以使用.setCreateSymbles(false)或(true)设置setAnimated(false)

我也遇到了同样的问题,并找到了解决办法。为了概述一下,我管理了一个包含所有系列的ArrayList。每次从图表中删除一个序列时,我都会在ArrayList中搜索它并清除该序列的数据(清除,而不是删除,数据对于保持颜色很重要)


直接删除系列1怎么样?该集成有这样一个示例,并且运行良好,但是我使用
lineChart.getData().remove(0)面对NPE在JavaFX2.2.0-b21上的按钮操作中。你能确认吗?谢谢Sergey的回复,但我仍然有问题:在这个示例中,我修改了上面的代码,添加了一个按钮以删除行序列,但我得到了空指针异常,我想知道为什么这个示例工作正常,但我的代码返回了错误。似乎(仍然)确实是一个错误——将setAnimated()设置为false解决了问题。
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));
        }
    }
.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; }