我的窗口有以下 Controller :
package window;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import java.util.Map;
import java.util.SortedMap;
public class StatisticsController {
@FXML
private BarChart<String, Number> barChartHistogram;
private SortedMap<String, Integer> _points;
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
public void onLoad(SortedMap<String, Integer> points) {
barChartHistogram = new BarChart<String, Number>(xAxis,yAxis);
barChartHistogram.setCategoryGap(0);
barChartHistogram.setBarGap(0);
xAxis.setLabel("Numer indeksu");
yAxis.setLabel("Ilość punktów");
XYChart.Series series = new XYChart.Series();
series.setName("Histogram");
for (Map.Entry<String, Integer> p: points.entrySet()) {
series.getData().add(new XYChart.Data(p.getKey(), p.getValue()));
}
barChartHistogram.getData().addAll(series);
_points = points;
}
@FXML
private void buttonShowPressed(ActionEvent event) {
xAxis.setLabel("Numer indeksu");
yAxis.setLabel("Ilość punktów");
barChartHistogram = new BarChart<String, Number>(xAxis,yAxis);
barChartHistogram.setCategoryGap(0);
barChartHistogram.setBarGap(0);
barChartHistogram.setTitle("XDDDDDDDDDDDDDDD");
barChartHistogram.setMaxHeight(1000);
XYChart.Series series = new XYChart.Series();
series.setName("Histogram");
for (Map.Entry<String, Integer> p: _points.entrySet()) {
series.getData().add(new XYChart.Data(p.getKey(), p.getValue()));
}
barChartHistogram.getData().addAll(series);
}
}
此窗口的 .fxml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="window.StatisticsController">
<children>
<BarChart fx:id="barChartHistogram" layoutX="40.0" layoutY="14.0" prefHeight="372.0" prefWidth="500.0">
<xAxis>
<CategoryAxis side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis side="LEFT" />
</yAxis>
</BarChart>
<Button fx:id="buttonShow" layoutY="337.0" mnemonicParsing="false" onAction="#buttonShowPressed" text="Button" />
</children>
</AnchorPane>
现在的问题是,当我按下按钮时,没有任何变化(onLoad()
方法用于测试 onLoad
类似 C# 的行为)。条形图保持不变,没有数据、标签或标题(我检查了调试器中的数据,barCharHistogram
对象在其 data
属性下有我的数据)。我做错了什么愚蠢的事吗?我怎样才能让它像重画条形图一样?
最佳答案
您已经在 FXML 中定义了所需的一切。您不应该在 Controller 中创建新图表或新轴。
将 fx:id
添加到坐标区:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="window.StatisticsController">
<children>
<BarChart fx:id="barChartHistogram" layoutX="40.0" layoutY="14.0" prefHeight="372.0" prefWidth="500.0">
<xAxis>
<CategoryAxis fx:id="xAxis" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis fx:d="yAxis" side="LEFT" />
</yAxis>
</BarChart>
<Button fx:id="buttonShow" layoutY="337.0" mnemonicParsing="false" onAction="#buttonShowPressed" text="Button" />
</children>
</AnchorPane>
然后你就可以做
public class StatisticsController {
@FXML
private BarChart<String, Number> barChartHistogram;
private SortedMap<String, Integer> _points;
@FXML
private CategoryAxis xAxis ;
@FXML
private NumberAxis yAxis ;
@FXML
private void buttonShowPressed(ActionEvent event) {
xAxis.setLabel("Numer indeksu");
yAxis.setLabel("Ilość punktów");
barChartHistogram.setCategoryGap(0);
barChartHistogram.setBarGap(0);
barChartHistogram.setTitle("XDDDDDDDDDDDDDDD");
barChartHistogram.setMaxHeight(1000);
XYChart.Series series = new XYChart.Series();
series.setName("Histogram");
for (Map.Entry<String, Integer> p: _points.entrySet()) {
series.getData().add(new XYChart.Data(p.getKey(), p.getValue()));
}
barChartHistogram.getData().addAll(series);
}
}
关于JavaFX BarChart 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48994521/