2012-08-23 49 views
2

我有一个简单系列绘制在XY折线图,如下JavaFX 2.x:如何删除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); 
} 

}

我想删除行绘制(通过单击按钮或通过标记复选框),并具有空的场景如下

enter image description here

我不知道如何删除一次绘制的线,没有发现任何一个.remove()或.delete()方法。

如何做到这一点?

感谢

回答

5

现在的问题解决了,现在看来,这是JavaFX的一个错误。

我已通过添加

lineChart.setAnimated(假)解决;它一切正常。在JIRA Kenai中,通过评论lineChart.setCreateSymbols(false);

这也适用,但我认为这不是正确的答案,我可以使用.setCreateSymbols(false)或(true)set setnnimated(false);

+2

似乎(仍然)确实是一个错误 - 将setAnimated()设置为false解决了这个问题。 –

1

你系列是ObservableList,你可以做任何你想通过这个清单,并且它会被反射。

例如,你的情况:

series1.getData().clear(); 
+0

直接删除series1怎么办? Ensemble有一个这样的例子,并且运行良好,但是我在NPE中用'lineChart.getData()。remove(0);'在JavaFX 2.2.0-b21的按钮操作中遇到了NPE。你可否确认? –

+1

谢尔盖感谢您的回复,但我仍然有问题:下面这个例子 http://docs.oracle.com/javafx/2/charts/ScatterChartSample.java.html 我已经修改了上面加了一个按钮,我的代码删除线系列,但我得到空指针异常,我不知道为什么这个例子工作正常,但我的代码返回错误。 –

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; }