2012-08-23 71 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; }