Добавлены повторяющиеся серии Javafx - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать простое приложение JavaFX, используя LineChart. Я хочу добавить сохранить все серии, которые я добавил на графике, щелкнуть после щелчка.

Я видел другие ответы об этой проблеме, но даже если я очистил все списки моего класса обслуживания, есть дублированные серии

Вот мой код:

Приложение

public class App extends Application {

@Override
public void start(Stage stage) throws Exception {
    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();
    BorderPane b = new BorderPane();
    MyService ser  =new MyService();
    LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);

    Button button = new Button("start");

    Button button1 = new Button("start2");
    button.setOnAction(((event)->{
        ser.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, //
                new EventHandler<WorkerStateEvent>() {

                    @Override
                    public void handle(WorkerStateEvent t) {

                        chart.getData().add(ser.getValue());

                    }
                });


        ser.restart();

    }));

    button1.setOnAction(((event) ->{
        XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();
        series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
        series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
        series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
        chart.getData().add(series);
    }));



    b.setBottom(button);
    b.setCenter(chart);
    b.setLeft(button1);

    Scene sc = new Scene(b);


    stage.setScene(sc);
    stage.show();

}



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

}

Мой класс обслуживания

public class MyService extends Service<XYChart.Series<Number, Number>> {
    @Override
    protected Task<XYChart.Series<Number, Number>> createTask() {
        return new Task<XYChart.Series<Number, Number>>() {
            @Override
            protected XYChart.Series<Number, Number> call() throws Exception {
                XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();


                series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
            series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
            series.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));


                return series;
            }
        };
    }
}

Мы можем видеть дублированные серии с метками

, возможно, мне придется go через временную переменную, а затем добавить серию вне дескриптора. В этом случае это хорошо, за исключением того, что у меня есть нулевое значение seriesTotal ..

public class App extends Application {

    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();

    private XYChart.Series<Number, Number> seriesTotal = new XYChart.Series<Number, Number>();

    private LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);

    @Override
    public void start(Stage stage) throws Exception {

        BorderPane b = new BorderPane();
        MyService ser = new MyService();

        // Job j = new Job();
        Button button = new Button("start");
        Button button1 = new Button("start2");

        List<Object> test = new ArrayList<>();

        button.setOnAction(((event) -> {
            test.clear();
            ser.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, //
                    new EventHandler<WorkerStateEvent>() {

                        @Override
                        public void handle(WorkerStateEvent t) {


                            seriesTotal = ser.getValue();
                            //test.add(ser.getValue());
                            //chart.getData().add(ser.getValue());


                        }

                    });



            ser.restart();

            System.out.println(seriesTotal);
            chart.getData().add(seriesTotal);
            seriesTotal.getData().clear();
        }));



        button1.setOnAction(((event) -> {
            XYChart.Series<Number, Number> series1 = new XYChart.Series<Number, Number>();
            series1.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
            series1.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
            series1.getData().add(new XYChart.Data<Number, Number>(Math.random(), Math.random()));
            chart.getData().add(series1);
            // chart.getData().setAll(arg0);
        }));

        b.setBottom(button);
        b.setCenter(chart);
        b.setLeft(button1);

        Scene sc = new Scene(b);

        stage.setScene(sc);
        stage.show();

    }

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

}
enter code here

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Похоже, что дескриптор службы выполняется несколько раз для клика, путем установки счетчика (или логического значения) в качестве атрибута и установки его на 0 на дескрипторе кнопки, чтобы остановить повторы, больше нет дублирования.

public class App extends Application {


    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();

    private int count = 0;
    private LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);

    @Override
    public void start(Stage stage) throws Exception {

        BorderPane b = new BorderPane();
        MyService ser = new MyService();

        // Job j = new Job();
        Button button = new Button("start");


        button.setOnAction(((event) -> {
            count = 0;

            ser.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, //
                    new EventHandler<WorkerStateEvent>() {

                        @Override
                        public void handle(WorkerStateEvent t) {


                            if(count==0) {
                                chart.getData().add(ser.getValue());
                                count++;
                            }





                        }

                    });



            ser.restart();





        }));





        b.setBottom(button);
        b.setCenter(chart);


        Scene sc = new Scene(b);

        stage.setScene(sc);
        stage.show();

    }

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



}
0 голосов
/ 20 апреля 2020

Я думаю, что в вашем коде путаница; в вашем button обработчике событий вы используете chart.getData() для вставки новых точек на экран, что не то же самое, что series.getData() в вашем MyService классе.

Просто для ясности :

LineChart<Number, Number>
|
| chart.getData()
|
V
Series<Number, Number>
|
| series.getData()
|
V
Data<Number, Number>

Когда вы нажимаете кнопку в приложении, вы не добавляете точку в текущую серию, вы добавляете новую серию, содержащую только одну точку, созданную вашим сервисом. Это может объяснить дублирование серий на вашем экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...