【问题标题】:Java Swing - JFreeChart app works slowlyJava Swing - JFreeChart 应用程序运行缓慢
【发布时间】:2014-11-25 20:32:00
【问题描述】:

我创建的 JFreeChart 程序可以:

  • 移动样条线的点
  • 不允许穿过黑色样条(边界样条)
  • 实时创建新样条线(作为 Grapher)
  • 鼠标滚轮缩放

为了向数据集添加新系列,我使用此功能:

   public static XYSeriesCollection createSplineDataset(File[] polFiles) {
        dataset = new XYSeriesCollection();
        for (File polFile : polFiles) {
            XYSeries series = new XYSeries(polFile.getName());
            Scanner s = null;
            try {
                s = new Scanner(new File(polFile.getAbsolutePath()));
            }catch (FileNotFoundException ex) {
                System.out.println("Scanner error!");
            }
            s.useLocale(Locale.US);
            while (s.hasNext()) {
                float x = s.nextFloat();
                float y = s.nextFloat();
                series.add(x, y);
            }
            dataset.addSeries(series);
        }
        return dataset;
    }

主程序(有 500+ 串代码,所以这是其中的一部分):

public class SplineDemo {
    // declaration of variables
    private static void display(){
        final File[] polFiles = new File("FORPLOT").listFiles();
        polFiles[0] = new File("FORPLOT/InitPolin1");
        polFiles[1] = new File("FORPLOT/InitPolin0");
        for (int i = 2; i <= 36; i++)
            polFiles[i] = new File("FORPLOT/P"+(i-2));
        dataset = JFunc.createSplineDataset(polFiles); // create dataset
        // --------some code-----------
        NumberAxis domain = new NumberAxis("\u03C1");
        NumberAxis range = new NumberAxis("g(\u03C1)");
        SplineRenderer r = new SplineRenderer(20);
        xyplot = new XYPlot(dataset, domain, range, r);
        final XYLineAndShapeRenderer render = (XYLineAndShapeRenderer) xyplot.getRenderer();
        render.setBaseShapesVisible(true);
        final JFreeChart chart = new JFreeChart(xyplot);
        // --------some code-----------            
        chartPanel = new ChartPanel(chart){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };        
        chart.removeLegend();
        chartPanel.addMouseListener(new MouseListener() {
        //------ for creating new splines and to move points of splines ---------
        });

        chartPanel.addMouseWheelListener(new MouseWheelListener() {
        //--------- zoom ------------
        });

        chartPanel.addMouseMotionListener(new MotionListener());

        chartPanel.addChartMouseListener(new ChartMouseListener() {
        //------ for creating new splines and to move points of splines ---------
        });

        chartPanel.setDomainZoomable(false);
        chartPanel.setRangeZoomable(false);
        chartPanel.setPopupMenu(null);
        frame = new JFrame(Title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(chartPanel);

        //------ buttons -------

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.addComponentListener(new ComponentListener() {

            @Override
            public void componentResized(ComponentEvent ce) {
            // ---- to move points when window was resized
            }
        });
    }

    public static class MotionListener implements MouseMotionListener {
    //------ to move points -----------
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                display();
            }
        });
    }
}

所以,@trashgod 建议 here 修改 useBuffer,但这对我没有帮助。 所以,我的问题是,当同时绘制 1-5 条样条曲线时,一切都非常理想。当它们在屏幕截图中超过 30 条样条时,工作会减速(例如,在移动的情况下,点不在鼠标后面,缩放工作较慢等)。问题可能在于什么?这是YourKit的报告,但我不明白。慢慢绘制所有图表或什么有效?

我不明白 30 个图表怎么会如此刹车。 100+的情况会怎样?如果有必要,我可以在 zip 存档中丢弃完整的代码和项目

【问题讨论】:

  • ~10^5+ 分?!对于example,除了切换渲染器、限制细节或控制可见性之外,我没有看到一个简单的解决方法。
  • 坦率地说:这不是 JFreeChart 的用途。它旨在绘制“漂亮”的图表,平滑且带有刻度线等。如果你想画“很多”这样的线,你无论如何都看不到任何东西,从纯粹的“信息可视化”的角度来看,你宁愿使用一些 edge bundling 算法左右(如有必要,请在网上搜索此术语)。如果您使用自己的手工制作的 Path2D 对象手动绘制 许多 曲线,则结果将是除了一些混乱的一堆之外,您什么都看不到线...
  • 交叉发布here

标签: java performance swing jfreechart


【解决方案1】:

XYSplineRenderer“用自然三次样条连接数据点。”不出所料,它的性能在数千个点上表现不佳。如果目标是渲染平滑的数据,最好按照here 的建议在background 中执行interpolation,然后恢复到父XYLineAndShapeRenderer 仅用于渲染。

此外,数十条曲线,每条曲线都有数百个点,在视觉上可能难以区分。考虑控制相关系列的可见性,如 example 所示,它使用 JCheckBox 切换单个系列的显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2015-05-03
    • 2018-03-28
    • 2010-11-21
    • 2011-01-14
    相关资源
    最近更新 更多