Java Swing – JFreeChart应用程序运行缓慢

我创建了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建议在这里修改useBuffer但它没有帮助我。 所以,我的问题是,当同时绘制了1-5个样条曲线时,一切都很快就能正常工作。 当它们在屏幕截图上变成超过30个样条线时,工作减速(例如,在移动的情况下,点不在鼠标后面,缩放工作较慢等等)。 问题可能包括什么? 来自YourKit的报告,但我不明白。 慢慢地所有图表的新绘制或什么有效?

我不明白30个图表是如何制动的。 在100+的情况下会是什么? 如果有必要,我可以在zip存档中删除完整的代码和项目

30个样条YourKit

XYSplineRenderer “将数据点与自然三次样条连接起来。” 出乎意料的是,它的性能在千分之一的情况下表现不佳。 如果目标是渲染平滑数据,则在背景中进行插值可能是有利的,如此XYLineAndShapeRenderer建议的,并且还原到父XYLineAndShapeRenderer以仅渲染。

另外,每个具有数百个点的曲线的分数可能难以在视觉上区分。 考虑控制相关系列的可见性,此示例中显示了使用JCheckBox切换单个系列的显示。