JavaFX BarChart 不更新

标签 java javafx

我的窗口有以下 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/

相关文章:

将图像添加到场景时出现 CSS 解析错误

java - 在运行时检查类是否具有使用泛型的特定构造函数

JavaFX 8 默认消息图标

java - 如何在javafx中缩放具有不同场景大小的 ImageView ?

java - 通过 Java Eclipse 进行 Android 开发 : I am Exporting But It Is Not Exporting As . apk 文件

docker - Docker 上的 JavaFX - 初始化 QuantumRenderer : no suitable pipeline found 时出错

JavaFX.按条件更改 TreeItem 样式

java - 等待上一个函数执行完毕

java - 仅在一行 String Android 中更改文本颜色

java - 执行在 getOutputStream() 函数处自动停止 使用 servlet 推送通知