条形图和堆积条形图在一个页面上使用类似数据

时间:2017-10-19 07:29:41

标签: eclipse charts javafx-8 bar-chart

我正在尝试使用JavaFx在条形图和堆积条形图中显示一些数据。我正在使用4个系列,我使用eclipse氧气填充数据。

我在条形图中使用了series1和series2。 我在Stacked Bar Chart中使用了series1,series2,series3和series4。

我使用JavaFx Scene Builder创建了我的屏幕。填充场景并显示数据。我的问题是我无法同时显示两个图表。只有后者才会填充,具体取决于人口的顺序。我添加的额外位是图形扩展鼠标输入事件,然后缩小到鼠标退出事件的原始大小。

任何人都可以指出我做错了什么来帮助我吗? 我的代码如下

@FXML
private void bcsbg_mouseentered() {
    if (!clickEntered) {
        clickEntered = true;
        prefWidth = bcByGroup.getPrefWidth();
        prefHeight = bcByGroup.getPrefHeight();
        bcByGroup.setPrefSize(1500, 900);
        gXAxis.setPrefHeight(Region.USE_COMPUTED_SIZE);
        gXAxis.setPrefWidth(Region.USE_COMPUTED_SIZE);
        gYAxis.setPrefHeight(Region.USE_COMPUTED_SIZE);
        gYAxis.setPrefWidth(Region.USE_COMPUTED_SIZE);
        gXAxis.setVisible(true);
        gYAxis.setVisible(true);
        gXAxis.setLabel("Value");  
        gYAxis.setLabel("Question"); 
        gXAxis.setTickLabelsVisible(true);
        gYAxis.setTickLabelsVisible(true);
        gXAxis.setTickMarkVisible(true);
        gYAxis.setTickMarkVisible(true);

        sbcByAll.setVisible(false);

    } else {
        clickEntered = false;
        bcByGroup.setPrefSize(prefWidth, prefHeight);
        gXAxis.setPrefHeight(0);
        gXAxis.setPrefWidth(0);
        gYAxis.setPrefHeight(0);
        gYAxis.setPrefWidth(0);
        gXAxis.setVisible(false);
        gYAxis.setVisible(false);
        gXAxis.setLabel("");  
        gYAxis.setLabel("");
        gXAxis.setTickLabelsVisible(false);
        gYAxis.setTickLabelsVisible(false);
        gXAxis.setTickMarkVisible(false);
        gYAxis.setTickMarkVisible(false);

        sbcByAll.setVisible(true);
        sbcByAll.getData().clear();
        sbcByAll.getData().addAll(series1, series2, series3, series4);

    }

    bcByGroup.getData().clear();
    bcByGroup.getData().addAll(series1, series2);

}

2 个答案:

答案 0 :(得分:0)

此处的问题不在您的代码中,而在于编写图表API的方式。 (我通常不会批评语言或标准库,但是这个API的部分内容似乎是由一个无人监督的实习生写的,特别糟糕的宿醉。)

XYChart.Data类保留显示数据的reference to the node。 (这显然违反了MVC的最基本原则,并将数据分成完全冗余的不同类。)

因此,如果您尝试在两个图表中使用相同的数据,则同一节点会尝试显示在两个父项中,这是不允许的,并且您只能在一个位置看到数据的可视化。不幸的是,您需要复制每个图表的数据。

答案 1 :(得分:0)

谢谢你,戴夫。你是对的。我没有浏览XYData.Chart上的标准文档,注意到该对象将附加到将要显示数据的节点。

我真的希望避免复制,但是一旦数据系列被复制并附加到不同的图表,代码就会起作用。

正如Dave所说,

  

XYChart.Data类保留显示数据的reference to the node。 (这显然违反了MVC的最基本原则,并将数据分成完全冗余的不同类。)

请仔细阅读Dave链接中提供的标准文档。