JavaFX图表中的缩放选择矩形未显示,但缩放正在工作

JavaFX图表中的缩放选择矩形未显示,但缩放正在工作,javafx,charts,Javafx,Charts,我已经编写了一个在JavaFX图表上实现缩放功能的示例程序,我从GitHub项目中找到了Zoom类,并且正在重用它。我的挑战是,当我拖动鼠标选择某个区域进行缩放时,选定区域矩形在Windows 7、Linux、Mac OS X中不会显示,但在Windows 10中效果良好。 我遗漏了什么,我如何才能使selectedRectangle显示出来,以便用户知道他们要放大到哪个区域 以下是编译和运行此程序所需的所有文件: /* * To change this license header, cho

我已经编写了一个在JavaFX图表上实现缩放功能的示例程序,我从GitHub项目中找到了Zoom类,并且正在重用它。我的挑战是,当我拖动鼠标选择某个区域进行缩放时,选定区域矩形在Windows 7、Linux、Mac OS X中不会显示,但在Windows 10中效果良好。 我遗漏了什么,我如何才能使selectedRectangle显示出来,以便用户知道他们要放大到哪个区域

以下是编译和运行此程序所需的所有文件:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testlinechartgraphs;

import java.util.ArrayList;
import java.util.Random;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TestLineChartGraphs extends Application {

    final static ObservableList<XYChart.Series<Number, Number>> lineChartData = FXCollections.observableArrayList();

    @Override
    public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        //defining the axes
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Number of Month");
        Random randomNumbers = new Random();
        ArrayList<Integer> arrayList = new ArrayList<>();

        //creating the chart
        final LineChart<Number, Number> lineChart
                = new LineChart<Number, Number>(xAxis, yAxis);

        lineChart.setTitle("Stock Monitoring, 2010");
        lineChart.setLegendSide(Side.RIGHT);

        int randomCount = randomNumbers.nextInt(14)+1;
        //System.out.println("randomCount = " + randomCount);
        for (int i = 0; i < randomCount; i++) {
            XYChart.Series series = new XYChart.Series();
            series.setName("series_" + i);
            for (int k = 0; k < 20; k++) {
                int x = randomNumbers.nextInt(50);

                series.getData().add(new XYChart.Data(k, x));
            }
            //seriesList.add(series);
            lineChartData.add(series);
        }


        lineChart.setData(lineChartData);

        final StackPane chartContainer = new StackPane();

        Zoom zoom = new Zoom(lineChart, chartContainer);

        chartContainer.getChildren()
                .add(lineChart);

        BorderPane borderPane = new BorderPane();

        borderPane.setCenter(chartContainer);
        //borderPane.setCenter(lineChart);

        borderPane.setBottom(getLegend());
////        
        //Scene scene = new Scene(lineChart, 800, 600);
        Scene scene = new Scene(borderPane, 800, 600);
        //lineChart.getData().addAll(series, series1);

        stage.setScene(scene);
        scene.getStylesheets().addAll("file:///C:/Users/siphoh/Documents/NetBeansProjects/WiresharkSeqNum/src/fancychart.css");
        //scene.getStylesheets().addAll(getClass().getResource("fancychart.css").toExternalForm());

        stage.show();
    }

    public static Node getLegend() {
        HBox hBox = new HBox();

        for (final XYChart.Series<Number, Number> series : lineChartData) {
            CheckBox checkBox = new CheckBox(series.getName());


            checkBox.setSelected(true);
            checkBox.setOnAction(event -> {
                if (lineChartData.contains(series)) {

                    lineChartData.remove(series);
                } else {
                    lineChartData.add(series);
                }
            });

            hBox.getChildren().add(checkBox);
        }

        hBox.setAlignment(Pos.CENTER);
        hBox.setSpacing(20);
        hBox.setStyle("-fx-padding: 0 10 20 10");

        return hBox;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
//fancychart.css文件

.chart-line-symbol {
    -fx-scale-x: 0.5;
    -fx-scale-y: 0.5;
}

.chart-popup-label {
    -fx-padding: 1 3 1 3;
    -fx-border-radius: 1;
    -fx-border-width: 1;
    -fx-opacity: 0.7;
    -fx-effect: dropshadow( two-pass-box , rgba(0,0,0,0.3) , 8, 0.0 , 0 , 3 );
}

.chart-legend-item {
    -fx-padding : 1 23 1 23;
}

.chart-legend-item-symbol {
   -fx-scale-x: 0.8;
   -fx-scale-y: 0.8;
}



.chart-selection-rectangle {
    -fx-stroke: rgba(135, 206, 250, 0.8);
    -fx-stroke-type: inside;
    -fx-fill: rgba(135, 206, 250, 0.2);
}







#zoomInfoLabel {
    -fx-background-color: rgba(135, 206, 250, 0.8);
    -fx-font-size: 14;
    -fx-padding: 3;
    -fx-background-radius: 2;
}
我们将非常感谢您为解决此问题提供的任何帮助


谢谢,

您的订单错了。你有

    final StackPane chartContainer = new StackPane();
    Zoom zoom = new Zoom(lineChart, chartContainer);
    chartContainer.getChildren().add(lineChart);
这意味着您首先创建容器,然后添加缩放矩形,然后添加图表。因此,缩放矩形位于图表的背面

您需要这样做:

    final StackPane chartContainer = new StackPane();
    chartContainer.getChildren().add(lineChart);
    Zoom zoom = new Zoom(lineChart, chartContainer);

非常感谢罗兰,这很有效!我花了好几天在这上面。。。再次感谢。
    final StackPane chartContainer = new StackPane();
    Zoom zoom = new Zoom(lineChart, chartContainer);
    chartContainer.getChildren().add(lineChart);
    final StackPane chartContainer = new StackPane();
    chartContainer.getChildren().add(lineChart);
    Zoom zoom = new Zoom(lineChart, chartContainer);