Problem med tegning af store mængder grafik
HejsaJeg sidder lige og arbejder lidt med at tegne en masse kurver i et JPanel, men har lidt problemer. Min tegning er gemt i et JGeneralPath og indeholder linier mellem cirka 135000 punkter.
Det går fint med at tegne denne grafik, men når der så skal scrolles på figuren, så går det utroligt langsomt. Figuren har en størrelse på cirka 27000 x 22000.
Jeg har prøvet at doublebuffer, så godt jeg kunne ved kun at oprette min figur en gang og siden blot vise et udsnit af figuren ved hjælp af clip metoden på Graphics2D. Jeg har så selv implementeret en listener, så jeg bare flytter mit clip, når der scrolles.
Mit problem er at dette kun virker ved små datamængder, men når jeg anvender mine testdata med 135000 punkter, så får jeg en java.lang.OutOfMemoryError som jeg kan spore tilbage til min clip metode.
Er der noger der ved hvad jeg kan gøre ved dette problem eller og jeg evt. burde anvende en anden opbygning?
Wagner
Jeg poster lige lidt af min kode:
public void paintComponent(Graphics g)
{
int x,y;
System.out.println("paint kaldet " + i++);
if (drawing != null)
{
Rectangle rect = new Rectangle(dx, dy, 600, 500);
/*
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
paintBorder(g);
*/
Graphics2D g2 = (Graphics2D)g;
g.setColor(Color.WHITE);
if (olddx > dx)
x = dx;
else
x = olddx;
if (olddy > dy)
y = dy;
else
y = olddy;
// clear før der tegnes noget nyt
g.fillRect(x, y, 600, 500);
// tegn den nye flade, der er blevet synlig
g.setColor(Color.BLACK);
g2.setClip(drawing);
g2.clip(rect);
g2.clipRect(dx, dy, 580, 480);
g2.draw(drawing);
/*
System.out.println("1. view:" + ((MainWindow)mainWindow).getViewport().getViewPosition().x + " " + ((MainWindow)mainWindow).getViewport().getViewPosition().y);
Point p = ((MainWindow)mainWindow).getViewport().toViewCoordinates(new Point(dx, dy));
((MainWindow)mainWindow).getViewport().setViewPosition(p);
System.out.println("2. view:" + ((MainWindow)mainWindow).getViewport().getViewPosition().x + " " + ((MainWindow)mainWindow).getViewport().getViewPosition().y);
*/
}
}
public void init()
{
Graphics g = this.getGraphics();
if (g != null)
{
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
paintBorder(g);
g.setColor(Color.BLACK);
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(SolidLine);
System.out.println("inint kaldt");
}
}
public void drawTerrain(Terrain terrain)
{
if(terrain != null)
{
Graphics2D g2 = (Graphics2D)this.getGraphics();
drawing = new GeneralPath();
Object[] terrainArray=terrain.toArray();
for (int i=0; i < terrainArray.length; i++)
{
drawKoteLayer(g2,i,(Elevation)terrainArray[i]);
}
//if (drawing != null)
// g2.draw(drawing);
}
}
private void drawKoteLayer(Graphics2D g2,int lineType, Elevation kote)
{
int[] xarr, yarr;
Object[] lineStringArray=kote.toArray();
for (int i=0; i < lineStringArray.length; i++)
{
if (lineType % 2==0)
{
g2.setStroke(SolidLine);
}
else
{
g2.setStroke(dashed);
}
xarr = kote.getLineString(i).getXArray();
yarr = kote.getLineString(i).getYArray();
if (xarr.length > 1)
{
drawing.moveTo((float)xarr[0], (float)yarr[0]);
for (int j = i; j < xarr.length; j++)
{
drawing.lineTo((float)xarr[j], (float)yarr[j]);
}
}
}
}
Bare sig til, hvis i har brug for mere kode.