我正在尝试使用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);
}
答案 0 :(得分:0)
此处的问题不在您的代码中,而在于编写图表API的方式。 (我通常不会批评语言或标准库,但是这个API的部分内容似乎是由一个无人监督的实习生写的,特别糟糕的宿醉。)
XYChart.Data
类保留显示数据的reference to the node。 (这显然违反了MVC的最基本原则,并将数据分成完全冗余的不同类。)
因此,如果您尝试在两个图表中使用相同的数据,则同一节点会尝试显示在两个父项中,这是不允许的,并且您只能在一个位置看到数据的可视化。不幸的是,您需要复制每个图表的数据。
答案 1 :(得分:0)
谢谢你,戴夫。你是对的。我没有浏览XYData.Chart上的标准文档,注意到该对象将附加到将要显示数据的节点。
我真的希望避免复制,但是一旦数据系列被复制并附加到不同的图表,代码就会起作用。
正如Dave所说,
XYChart.Data类保留显示数据的reference to the node。 (这显然违反了MVC的最基本原则,并将数据分成完全冗余的不同类。)
请仔细阅读Dave链接中提供的标准文档。