如何使用 ObservableLists 在 Javafx 中创建条形图或折线图

保证

我正在尝试从使用 Java 保存在 sql 数据库中的数据生成统计图(BarCharts 和 LineCharts)。数据预计会不时发生变化。

我曾尝试使用 ObservableLists,但收到错误消息。

以下是我迄今为止尝试过的;注意:这驻留在 DatabaseHandler 类中

public ObservableList<BarChart.Data> getItemGraphStatistics(){
        ObservableList<BarChart.Data> data = FXCollections.observableArrayList();

        String sql = "SELECT itemID, COUNT(*) FROM (SELECT itemID FROM SALES UNION ALL SELECT itemID FROM STOCK) t GROUP BY itemID";
        System.out.println(sql );
        ResultSet rs = handler.execQuery(sql);
        try{

            while(rs.next()){
                String item= rs.getString("itemID");
                int count = rs.getInt(2);

                data.add(new BarChart.Data(item+ "(" + count + ")", count));

            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return data;

    }

在运行上面我得到

java.lang.ClassCastException: javafx.scene.chart.XYChart$Data cannot be cast to javafx.scene.chart.XYChart$Series

当我尝试将 BarChart.Data 更改为 BarChart.Series 时,我无法将 int 转换为 observableList 错误消息。

以下是上述试验的示例;

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXRadioButton;
import com.jfoenix.controls.JFXTextField;
import java.net.URL;
import java.util.Calendar;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.PieChart;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ToggleGroup;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import sales.manager.database.DatabaseHandler;

/**
 * FXML Controller class
 *
 * @author Garande
 */
public class PerformanceAnalyzerController implements Initializable {

    @FXML
    private AnchorPane analysisHandler;
    @FXML
    private AnchorPane graphHandler;
    @FXML
    private PieChart piechart;
    @FXML
    private BarChart<?, ?> barchart;
    @FXML
    private LineChart<?, ?> linechart;

    @FXML
    private NumberAxis yBarGraph;
    @FXML
    private CategoryAxis xBarGraph;
    @FXML
    private NumberAxis yLineGraph;
    @FXML
    private CategoryAxis xLineGraph;

    DatabaseHandler handler = DatabaseHandler.getInstance();

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {


    }    

    @FXML
    private void performAnalysisOperation(ActionEvent event) {
        //Performing analysis operation

        barchart.setData(handler.getItemGraphStatistics());
        graphHandler.getChildren().add(barchart);
    }
}
色拉

dataan属性XYChart持有一个ObservableList<XYChart.Series>每个XYChart.Series 有一个data属性,但它持有一个ObservableList<XYChart.Data>. 问题是您的方法返回一个ObservableList<XYChart.Data>,然后您尝试设置它XYChart.data- 类型不匹配。我不确定你是如何得到 a 的ClassCastException,因为你的代码甚至不应该编译。

您需要将数据列表包装在一个系列中,然后将该系列添加到图表中。您还应该避免使用原始类型双方SeriesData具有类型参数,但你不指定它们。根据您构建 的方式Data,您的代码应该类似于(为简洁起见省略了一些代码):

public class PerformanceAnalyzerController {

    @FXML private BarChart<String, Number> barChart;

    @FXML
    private void performAnalysisOperation(ActionEvent event) {
        //Performing analysis operation

        ObservableList<XYChart.Data<String, Number>> data = handler.getItemsGraphicsStatisitics();
        XYChart.Series<String, Number> series = new XYChart.Series<>("Series Name", data);

        barchart.getData().setAll(series);
        graphHandler.getChildren().add(barchart);
    }

}

和:

// Use generic types
public ObservableList<XYChart.Data<String, Number>> getItemGraphStatistics(){
    ObservableList<XYChart.Data<String, Number>> data = FXCollections.observableArrayList();

    String sql = "SELECT itemID, COUNT(*) FROM (SELECT itemID FROM SALES UNION ALL SELECT itemID FROM STOCK) t GROUP BY itemID";
    System.out.println(sql );
    ResultSet rs = handler.execQuery(sql);
    try{

        while(rs.next()){
            String item= rs.getString("itemID");
            int count = rs.getInt(2);

            // add diamond operator "<>"
            data.add(new XYChart.Data<>(item+ "(" + count + ")", count));

        }
    } catch (SQLException ex) {
        Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    return data;

}

注意:我替换了BarChart.Datawith 的使用XYChart.Data,但我认为在这种情况下这无关紧要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用ggplot在一个图表中创建条形图和折线图

JavaFX中的复杂并发:使用多个工作线程中的ObservableLists和Properties

如何从折线图更改为条形图

使用选取框行为创建折线图和条形图

如何在ggplot2中绘制组合的条形图和折线图

如何在双Y轴图中的ggvis中对齐条形图和折线图?

如何在ZingChart中的折线图和条形图之间对齐垂直参考线?

情节:如何将条形图和折线图与条形图组合为子图?

如何在 R 中使用折线图实现堆积条形图

如何使用ng2-charts获取多个图表(条形图和折线图)?

如何使用R组合特定变量的折线图和条形图

如何仅用一个分组变量将ggplot2中的折线图和条形图合并?

如何在chart.js中的条形图和折线图顶部显示数据值3

使用pandas和matplotlib绘制叠加图(折线图和条形图)

如何用条形图绘制累积百分比折线图?

Chart.js如何获取组合条形图和折线图?

如何在条形图和折线图的同一图上绘制多个列表?

pandas DataFrame如何混合不同比例的条形图和折线图

如何绘制混合的条形图和折线图并获取x轴作为年份

如何对齐条形图和两个折线图?

如何将折线图与带注释的分组条形图合并

无法使用pandas plot()函数组合条形图和折线图

使用iOS图表的组合图表(折线图和条形图)

Python使用辅助y轴制作条形图和折线图

带折线图的条形图-使用非数字索引

使用ggplot的条形图和折线图的多个y轴

Python:使用 DataFrame 绘制折线图和条形图时 DatetimeIndex 的不同行为

如何使用按钮向Matplotlib条形图和折线图添加排序功能

JavaFX 中的折线图