我创建的 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();
}
});
}
}
So, @垃圾神建议here修改useBuffer
但这对我没有帮助。
所以,我的问题是,当同时绘制 1-5 个样条线时,一切都会很快理想地运行。当它们变成超过 30 个样条线(如屏幕截图所示)时,工作速度就会减慢(例如,在移动时点不会及时位于鼠标后面,缩放工作速度会变慢等)。问题可能出在哪里?这是 YourKit 的报告,但我不明白。慢慢地重新绘制所有图表或什么作品?
我不明白 30 个图表怎么能这么刹车。如果100+会怎样?如果有必要,我可以在 zip 存档中提供完整的代码和项目
The XYSplineRenderer“用自然三次样条连接数据点。”不出所料,它的性能在数千点的扩展上很差。如果目标是渲染平滑数据,则执行以下操作可能会更有利插值法 in the 背景,按照建议here,并恢复到父级XYLineAndShapeRenderer
仅用于渲染。
此外,数十条曲线(每条曲线都有数百个点)可能难以在视觉上区分。考虑控制相关系列的可见性,如下所示example使用JCheckBox
切换单个系列的显示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)