Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
571 views
in Technique[技术] by (71.8m points)

javafx - Recreate bar chart without it remembering data

Task

I have a BarChart which I have to fill with different data over and over again. The data must be in a predefined order. Of course I only want to change the data and not create a bar chart every time.

Problem

Once you have a category with a given name that already existed in earlier data, the order is wrong.

I created an example. By clicking on the "Insert Before" button, a given number of bars is added. After that the "static" bar is added.

The "Insert After" button adds the "static" bar first and then the other bars.

public class BarChartSample extends Application {

    int count = 1;

    @Override
    public void start(Stage stage) {

        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis();
        final BarChart<String, Number> bc = new BarChart<String, Number>(xAxis, yAxis);
        bc.setAnimated(false);

        // create new chart data where the data are inserted before the "static" bar
        Button insertBeforeButton = new Button("Insert Before");
        insertBeforeButton.setOnAction(e -> {

            XYChart.Series series1 = new XYChart.Series();

            for (int i = 0; i < count; i++) {
                series1.getData().add(new XYChart.Data("New " + i, 50));
            }

            series1.getData().add(new XYChart.Data("Static", 100));

            bc.getData().setAll(series1);

            count++;

        });

        // create new chart data where the data are inserted after the "static" bar
        Button insertAfterButton = new Button("Insert After");
        insertAfterButton.setOnAction(e -> {

            XYChart.Series series1 = new XYChart.Series();

            series1.getData().add(new XYChart.Data("Static", 100));

            for (int i = 0; i < count; i++) {
                series1.getData().add(new XYChart.Data("New " + i, 50));
            }

            bc.getData().setAll(series1);

            count++;

        });

        // borderpane for chart and toolbar
        BorderPane bp = new BorderPane();
        bp.setCenter(bc);

        // toolbar
        HBox hb = new HBox();
        hb.getChildren().addAll(insertBeforeButton, insertAfterButton);
        bp.setTop(hb);

        Scene scene = new Scene(bp, 400, 200);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

When you start the program and click on "Insert Before", you get this:

enter image description here

When you restart the program and click on "Insert After", you get this:

enter image description here

When you restart the program and click on "Insert Before" and then on "Insert After", you get this:

enter image description here

which is wrong. It should be this:

enter image description here

Is there a way to clear the barchart's memory? Obviously setData isn't sufficient.

I suspect it has something to do with the special removal methods in the bar chart and that the data weren't removed totally when the new data are added. There are some dubious methods like "seriesBeingRemovedIsAdded" in the source code of the BarChart class in JavaFX.

Thank you very much for the help!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Well.. again calling the layout() seems to solve the problem

bc.getData().clear();
bc.layout();
bc.getData().addAll( series1 );

in the "Insert After" second loop.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...