JavaSwing-JFreeChart应用程序运行缓慢
我创建的JFreeChart程序可以:JavaSwing-JFreeChart应用程序运行缓慢,java,performance,swing,jfreechart,Java,Performance,Swing,Jfreechart,我创建的JFreeChart程序可以: 移动样条曲线的点 不允许交叉黑色样条线(边界样条线) 实时创建新样条线(作为图示器) 鼠标滚轮缩放 要将新系列添加到数据集,我使用以下函数: public static XYSeriesCollection createSplineDataset(File[] polFiles) { dataset = new XYSeriesCollection(); for (File polFile : polFiles)
- 移动样条曲线的点
- 不允许交叉黑色样条线(边界样条线)
- 实时创建新样条线(作为图示器)
- 鼠标滚轮缩放
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多个代码字符串,因此这是它的一部分):
公共类SplineDemo{
//变量声明
私有静态无效显示(){
最终文件[]polFiles=新文件(“FORPLOT”).listFiles();
polFiles[0]=新文件(“FORPLOT/InitPolin1”);
polFiles[1]=新文件(“FORPLOT/InitPolin0”);
对于(int i=2;i“将数据点与自然三次样条曲线连接起来”。毫不意外,它的性能在数千个点的情况下伸缩性很差。如果目标是渲染平滑数据,则按照建议在中执行,并恢复为仅用于渲染的父级xylineandshaperender
,这可能是有利的
另外,每一个都有几百个点的曲线,很难在视觉上区分。考虑控制相关系列的可见性,一个用“代码> jcCuthbox < /Cord>”来显示单个系列的显示。
~10 ^ 5 +点!我看不出一个简单的修复,除了切换渲染器,限制细节。或者控制可见性。坦率地说,这不是JFreeChart的目的。它旨在绘制“好看”的图表,平滑且带有记号等。如果你想画“许多”这样的线,你无论如何都看不到任何东西,而且是从纯粹的“信息可视化”中从这个角度来看,你更愿意使用一些边缘绑定算法(如果需要的话,可以通过web搜索这个术语)。如果你用自己的手工制作的Path2D
对象来手动绘制,你可能可以绘制更多的曲线,但结果是,除了一些混乱的线串之外,你什么都看不到……交叉张贴。
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();
}
});
}
}