Javafx: как скрыть узел XYChart при связывании == null - PullRequest
1 голос
/ 02 апреля 2019

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

Я мог бы найти способ обработать «пустоту» и установить его на 0.0, но на самом деле мне нужно скрыть завершение узла в этом случае (если поле «X» или «Y» пусто)

Есть идеи, как ее решить?

Базовый пример только с одним набором текстовых полей:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class LineChartSample extends Application {

    @Override
    public void start(Stage stage) {
         stage.setTitle("Demo");
         final NumberAxis xAxis = new NumberAxis();
         final NumberAxis yAxis = new NumberAxis();
         xAxis.setLabel("X");
         yAxis.setLabel("Y");
         final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
         AnchorPane ap = new AnchorPane();

         lineChart.setTitle("Demo");
         XYChart.Series series = new XYChart.Series();
         AnchorPane.setTopAnchor(lineChart, 5d);
         AnchorPane.setLeftAnchor(lineChart, 5d);
         AnchorPane.setRightAnchor(lineChart, 5d);

         TextField t1 = new TextField("33.3");
         TextField t2 = new TextField("33.3");

         Data d = new XYChart.Data();
         d.XValueProperty().bind(Bindings.when(t1.textProperty().isEmpty())
                 .then(0.0) //   <--  here is the problem
                 .otherwise(Bindings.createDoubleBinding(() -> {
                          return Double.parseDouble(t1.getText());
                 }, t1.textProperty())));

          d.YValueProperty().bind(Bindings.when(t2.textProperty().isEmpty())
                 .then(0.0) //   <--  here is the problem
                 .otherwise(Bindings.createDoubleBinding(() -> {
                        return Double.parseDouble(t2.getText());
                  }, t2.textProperty())));


         series.getData().add(d);

         AnchorPane.setBottomAnchor(t1, 50d);
         AnchorPane.setLeftAnchor(t1, 5d);

         AnchorPane.setBottomAnchor(t2, 50d);
         AnchorPane.setRightAnchor(t2, 5d);

         ap.getChildren().addAll(lineChart, t1, t2);
         Scene scene = new Scene(ap, 800, 600);
         lineChart.getData().add(series);
         stage.setScene(scene);
         stage.show();
     }

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

1 Ответ

0 голосов
/ 02 апреля 2019

Я нашел решение, добавив

    t1.textProperty().addListener((observable) -> {
        if (t1.getText().isEmpty() || t2.getText().isEmpty()) {
            d.getNode().setVisible(false);
        } else {
            d.getNode().setVisible(true);
        }
    });
    t2.textProperty().addListener((observable) -> {
        if (t1.getText().isEmpty() || t2.getText().isEmpty()) {
            d.getNode().setVisible(false);
        } else {
            d.getNode().setVisible(true);
        }
    });

Но если кто-нибудь знает более изящный способ, я был бы весьма счастлив.

...