1

JavaFX 2.2 の折れ線グラフの値マーカーに取り組んでいます。したがって、ここのstackoverflowに関する既存の質問に対する回答を使用しました.Sergey Grinevの例は正常に機能しています。ただし、ハードコードされたチャートを追加するのではなく、FXML を使用してチャートを追加したい場合、チャートの背景のサイズを決定する際に問題が発生します。

chartとの初期化を、ルート要素が処理された後に FXMLLoader が自動的に呼び出すメソッドに移動しvalueMarkerましinitialize()た ( JavaFX ドキュメントの注を参照)。しかし、次のコードを使用してグラフの背景のサイズを決定すると、バインドされた値ごとに 0.0 が返されます。

Node chartArea = chart.lookup(".chart-plot-background");
Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal());

メソッド内のまったく同じコードはupdateMarker()、2 回目の呼び出しで決定されたグラフの背景のサイズを返します。最初の呼び出しで境界が設定されますが、minX は正しくありません。これが私のコードです:

public class LineChartValueMarker extends Application {

    @FXML
    private LineChart<Number, Number> chart;

    @FXML
    private Line valueMarker;

    @FXML
    private NumberAxis yAxis;

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

    private void updateMarker() {
        Node chartArea = chart.lookup(".chart-plot-background");
        Bounds chartAreaBounds = chartArea.localToScene(chartArea
                .getBoundsInLocal());

        // SIZE OF THE CHART IS DETERMINED
        System.out.println(chartAreaBounds);

        valueMarker.setStartX(chartAreaBounds.getMinX());
        valueMarker.setEndX(chartAreaBounds.getMaxX());
    }

    public void initialize() {
        series.getData().add(new XYChart.Data(0, 0));
        series.getData().add(new XYChart.Data(10, 20));

        chart.getData().addAll(series);

        // add new value on mouseclick for testing
        chart.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                series.getData().add(
                        new XYChart.Data(series.getData().size() * 10,
                                30 + 50 * new Random().nextDouble()));
                updateMarker();
            }
        });

        // find chart area Node
        Node chartArea = chart.lookup(".chart-plot-background");
        Bounds chartAreaBounds = chartArea.localToScene(chartArea
                .getBoundsInLocal());

        // SIZE AND POSITION OF THE CHART IS 0.0
        System.out.println(chartAreaBounds);
    }

    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader loader = new FXMLLoader();

        InputStream in = this.getClass().getResourceAsStream(
                "LineChartValueMarker.fxml");
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(this.getClass().getResource(
                "LineChartValueMarker.fxml"));

        Pane pane = (Pane) loader.load(in);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }

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

境界を出力するコード内の位置に大文字のコメントを追加しました (そして、の Y 座標の更新を削除しましたvalueMarker)。出力は次のとおりです。

BoundingBox [minX:0.0, minY:0.0, minZ:0.0, width:0.0, height:0.0, depth:0.0, maxX:0.0, maxY:0.0, maxZ:0.0]
BoundingBox [minX:45.0, minY:15.0, minZ:0.0, width:441.0, height:318.0, depth:0.0, maxX:486.0, maxY:333.0, maxZ:0.0]
BoundingBox [minX:37.0, minY:15.0, minZ:0.0, width:449.0, height:318.0, depth:0.0, maxX:486.0, maxY:333.0, maxZ:0.0]

最初の出力行はinitialize()メソッドから取得され、2 行目は の最初の呼び出しupdateMarker()(グラフの最初のマウスクリック) から、3 行目は の 2 番目の呼び出しupdateMarker()(グラフの 2 番目のマウスクリック) から取得され、最終的にチャートの正しい境界値を返します。バックグラウンド。

ここで私の質問: チャートの背景の正しいサイズをいつ、どのように決定できますか (このinitialize()方法が最適です)。この動作について説明がないので、誰かが助けてくれることを願っています。ありがとうございました!

4

0 に答える 0