You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX折线图无法绘制且数据顺序异常问题求助

汇率折线图问题解决方案

一、数据乱序问题修复

1. 修正数据读取逻辑

原prepareDataToDraw方法中,当数据行数超过5时,循环仅会读取最后一行数据,导致图表数据缺失且逻辑错误。同时,drawChart方法未正确填充日期列表,CategoryAxis会自动按字符串排序日期,引发乱序。

修正后的prepareDataToDraw方法:

public ArrayList<ArrayList<String>> prepareDataToDraw() {
    ArrayList<ArrayList<String>> data = new ArrayList<>();

    if (lines.size() > 5) {
        // 读取最近5条数据,而非仅最后一行
        for(int i = lines.size() - 5; i < lines.size(); i++) {
            String[] tmpStr = lines.get(i).split(" ");
            ArrayList<String> tmpBlock = new ArrayList<>();
            tmpBlock.add(tmpStr[0]);
            tmpBlock.add(tmpStr[2]);
            tmpBlock.add(tmpStr[3]);
            tmpBlock.add(tmpStr[4]);
            data.add(tmpBlock);
        }
    } else {
        for (String line : lines) {
            String[] tmpStr = line.split(" ");
            ArrayList<String> tmpBlock = new ArrayList<>();
            tmpBlock.add(tmpStr[0]);
            tmpBlock.add(tmpStr[2]);
            tmpBlock.add(tmpStr[3]);
            tmpBlock.add(tmpStr[4]);
            data.add(tmpBlock);
        }
    }
    return data;
}

2. 修正图表绘制逻辑

在drawChart中填充日期列表,强制x轴按数据原始顺序显示,同时清空旧数据避免重复绘制:

public void drawChart() {
    chart.setTitle("汇率变化趋势");
    chart.setAxisSortingPolicy(LineChart.SortingPolicy.NONE);
    xAxis.setLabel("日期");
    yAxis.setLabel("汇率");
    dates.clear();
    cures.clear();
    ArrayList<ArrayList<String>> data = par.prepareDataToDraw();

    // 按数据顺序填充日期列表,确保x轴顺序正确
    for(ArrayList<String> row : data) {
        dates.add(row.get(0));
    }
    xAxis.setCategories(dates);

    // 清空旧数据,避免重复绘制系列
    chart.getData().clear();

    ArrayList<XYChart.Series> listSeries = new ArrayList<>();
    // 确保items索引对应美元、欧元、兹罗提的列
    for (int i = 1; i < items.size(); i++) {
        XYChart.Series tmpSeries = new XYChart.Series();
        tmpSeries.setName(items.get(i));
        for (int j = 0; j < data.size(); j++) {
            tmpSeries.getData().add(new XYChart.Data(data.get(j).get(0), Double.parseDouble(data.get(j).get(i))));
        }
        chart.getData().add(tmpSeries);
    }
}

二、图表显示异常修复

原FXML中LineChart未设置尺寸约束,导致窗口显示异常。需添加尺寸属性并优化GridPane布局:

修正后的FXML图表部分:

<GridPane hgap="15" vgap="15" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.demo.HelloController">
    <!-- 添加列约束,让第二列自适应宽度 -->
    <columnConstraints>
        <ColumnConstraints/>
        <ColumnConstraints hgrow="ALWAYS"/>
    </columnConstraints>
    
    <!-- 其他控件省略 -->
    
    <LineChart fx:id="chart" GridPane.rowIndex="10" GridPane.columnIndex="2"
               prefWidth="600" prefHeight="400">
        <xAxis>
            <CategoryAxis fx:id="xAxis"/>
        </xAxis>
        <yAxis>
            <NumberAxis fx:id="yAxis"/>
        </yAxis>
    </LineChart>
</GridPane>

内容的提问来源于stack exchange,提问作者Kerby3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:04:52