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

}

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

在此处输入图像描述

我不知道如何删除线一旦绘制,还没有找到任何 .remove() 或 .delete() 方法。

如何做到这一点?

谢谢

4

3 回答 3

7

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

我已经通过添加解决了

lineChart.setAnimated(false); 一切正常。在 JIRA Kenai 中,它已通过评论 lineChart.setCreateSymbols(false); 被提议为 bug;

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

于 2012-08-24T17:27:12.987 回答
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; }
于 2012-10-24T16:23:36.637 回答
1

你的系列是一个ObservableList,你可以用那个列表做任何你想做的事情,它会被反映。

例如,在您的情况下:

    series1.getData().clear();
于 2012-08-23T15:07:29.930 回答