【问题标题】:JFreeChart - Can't see plot unless I zoom inJFreeChart - 除非我放大,否则看不到情节
【发布时间】:2021-01-05 07:09:29
【问题描述】:

我有一个 Jfreechart,它正在绘制一些模拟实时数据。当我将域轴设置为自动时,可以看到数据每秒更新一次。但是,我希望将数据绘制在更广泛的范围内(比如一整天)。当我更改范围时,除非放大,否则我无法看到绘图。

放大后,该线不会覆盖整个图形,而只会覆盖一部分。然后这条线在图表上移动,而不是沿着它增长/绘制

/** @see http://stackoverflow.com/questions/5048852 */
public class DTSCTest extends ApplicationFrame {

    private static final String TITLE = "Dynamic Series";
    private static final String START = "Start";
    private static final String STOP = "Stop";
    private static final float MINMAX = 100;
    private static final int COUNT = 10;
    private static final int FAST = 1000;
    private static final int SLOW = FAST * 5;
    private static final Random random = new Random();
    private double gateStart = ThreadLocalRandom.current().nextInt(0, 101);
    private boolean returning = false;
    private Timer timer;

    public DTSCTest(final String title) {
        super(title);
        final DynamicTimeSeriesCollection dataset =
                new DynamicTimeSeriesCollection(1, COUNT, new Second());
        Date date = new Date();
        dataset.setTimeBase(new Second(date));
        float[] gateStartLoad = new float[1];
        gateStartLoad[0] = (float)gateStart;
        dataset.addSeries(gateStartLoad, 0, "Longwall Data");
        JFreeChart chart = createChart(dataset);
        final JComboBox combo = new JComboBox();
        combo.addItem("Fast");
        combo.addItem("Slow");
        combo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ("Fast".equals(combo.getSelectedItem())) {
                    timer.setDelay(FAST);
                } else {
                    timer.setDelay(SLOW);
                }
            }
        });

        this.add(new ChartPanel(chart), BorderLayout.CENTER);
        JPanel btnPanel = new JPanel(new FlowLayout());
        btnPanel.add(combo);
        this.add(btnPanel, BorderLayout.SOUTH);

        timer = new Timer(FAST, new ActionListener() {

            float[] newData = new float[1];

            @Override
            public void actionPerformed(ActionEvent e) {
                if(gateStart == 100){
                    returning = true;
                }else if(gateStart == 0){
                    returning = false;
                }
                if(returning){
                    gateStart--;
                }else{
                    gateStart++;
                }
                newData[0] = (float)gateStart;
                dataset.advanceTime();
                System.out.println(dataset.getNewestTime());
                dataset.appendData(newData);
            }
        });
    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(
                TITLE, "hh:mm:ss", "Shearer Position", dataset, true, true, false);
        final XYPlot plot = result.getXYPlot();
        DateAxis domain = (DateAxis)plot.getDomainAxis();
        Calendar calendar = Calendar.getInstance();
        calendar.set(2021, 0, 6);
        System.out.println(new Date());
        System.out.println(calendar.getTime());
        domain.setRange(new Date(), calendar.getTime());
        domain.setDateFormatOverride(new SimpleDateFormat("HH:mm:ss"));

        ValueAxis range = plot.getRangeAxis();
        range.setRange(0, 100);
        return result;
    }

    public void start() {
        timer.start();
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DTSCTest demo = new DTSCTest(TITLE);
                demo.pack();
                RefineryUtilities.centerFrameOnScreen(demo);
                demo.setVisible(true);
                demo.start();
            }
        });
    }
}

如何使线连续(显示系列中每个观察到的数据点),以及如何在手动设置范围时使其可见

【问题讨论】:

  • 您是否尝试过建议here 并引用here 的方法之一?
  • @trashgod 我认为第一种方法对我没有任何用处,我在当前日期创建数据集。至于第二种方法,我使用了 AdvanceTime(),然后是 appendData()。我的解决方案一直有效,直到我设置了日期范围,然后该图不再可见且不连续

标签: java swing jfreechart


【解决方案1】:

我删除了domain.setRange(new Date(), calendar.getTime()); 并在我的DynamicTimeSeriesCollection(1, COUNT, new Second()); 中更改了nMoments,使 COUNT 成为 60 的倍数并增加其值。我的 x 轴现在可以正确显示时间,但绘图不连续,一段时间后消失

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多