Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D)

Hutmacher

Bekanntes Mitglied
Hallo :)
In meinem Programm habe ich ein JFrame, auf dem ein JScrollPane liegt. In diesem ist wiederum ein Panel, in dem sehr viel gezeichnet wird. Genauer gesagt muss das JPanel einige (~300) Bilder halten, die dann dort reingemalt werden.

Natürlich sind es verschiedene Bilder, die gemalt werden, aber als Vereinfachung habe ich nun einfach 300x das gleiche Bild genommen (PNG, 477x400, 33,2Kb). Das sieht dann so aus:


Das Problem:
Wenn ich nach unten scrolle, "kommt das JScrollPane nicht mehr hinterher" und alles laggt.

Der Sourcecode (ein kleines SSCCE):
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class DrawingTest extends JFrame
{
	private JPanel panel = new JPanel()
	{
		private BufferedImage image = readImage("X.png");
		
		@Override
		public Dimension getPreferredSize()
		{
			return new Dimension(image.getWidth() * 3, image.getHeight() * 100);
		}
		
		@Override
		public void paintComponent(Graphics graphics)
		{
			super.paintComponent(graphics);
			
			long time = System.currentTimeMillis();
			
			for (int i = 0; i < 100; i++)
			{
				for (int j = 0; j < 3; j++)
				{
					graphics.drawImage(image, image.getWidth() * j, image.getHeight() * i, null);
				}
			}
			
			System.out.println(System.currentTimeMillis() - time + "ms");
		}
	};
	
	public DrawingTest()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800, 800);
		JScrollPane scrollPane = new JScrollPane(panel);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.getVerticalScrollBar().setUnitIncrement(100);
		add(scrollPane);
	}

	private BufferedImage readImage(String filename) 
	{
		BufferedImage image = null;
		
		try {
			image = ImageIO.read(new File(filename));
			image.flush();
		} 
		catch (IOException e) {
			throw new RuntimeException("Could not load");
		}
		
		return image;
	}
	
	public static void main(String[] args)
	{
		DrawingTest t = new DrawingTest();
		t.setVisible(true);
	}
}

Wie kann ich das Problem lösen, dass das Scrollen so extrem langsam und laggy ist?

Am besten probiert ihr es selbst mal aus; im Anhang findet ihr eine ZIP-Datei, in der diese Klasse als Runnable JAR mit dem Test-Bild "X.png" und dem Sourcecode liegt. Scrollt einfach mal ein bisschen nach unten.


Bin dankbar für jede Hilfe!

(Anm:
Ich habe zum Test einmal die Variable "BufferedImage image" durch ein "VolatileImage image" ersetzt - das Zeichnen geht zwar viel schneller, allerdings sollen in der "richtigen Version" des Programms ~300 verschiedene Bilder im Speicher gehalten werden, weshalb VolatileImage dort wenig sinnvoll ist.)
 

Anhänge

  • Try it yourself.zip
    51,6 KB · Aufrufe: 7

MrClave

Bekanntes Mitglied
Kann es sein, dass dein PC nicht der beste ist ?

Ich habe bei 300 Bildern absolut keine laggs.
Erst bei rund 100.000 Bildern fängt es bei mir an zu haken.

Sehe auch da auch keine Verbesserungsmöglichkeiten auf Anhieb. 300 Bilder sollten eigentlich für keinen PC zu Problemen führen.
Gibt bestimmt irgendwelche Vorgehensweisen aus der Spielebranche, aber da kenne ich mich nicht mit aus.
 
Zuletzt bearbeitet:

Hutmacher

Bekanntes Mitglied
Eigentlich dürfte mein Laptop lockerst genug Power dafür haben (GeForce GT 640M, Intel i5, 4GB RAM).
Danke jedenfalls fürs Testen :)

Aber habe die Lösung gerade gefunden:
Normale BufferedImages, wenn ich sie per ImageIO.read einlesen, scheinen in einem Format zu sein, das für meinen Bildschirm kräftig umgerechnet werden muss, um ausgegeben zu werden. Das scheint bei einem einfachen Zeichenprozess kein Problem zu sein, allerdings wird immer, wenn ich im ScrollPane scrolle, die repaint-Methode erneut aufgerufen - daher kommt es zu Lags. Deshalb habe ich ein mal versucht, das Bild, das ich zeichnen lasse, vorher in ein kompatibles Format zu konvertieren. Dazu benutze ich die unten stehende Methode und erzeuge mein Bild nun einfach per:
Code:
BufferedImage image = toCompatibleImage(readImage("X.png"));

Java:
public static BufferedImage toCompatibleImage(BufferedImage image)
	{
		GraphicsConfiguration graphicsConfig = GraphicsEnvironment
			                                   .getLocalGraphicsEnvironment()
			                                   .getDefaultScreenDevice()
			                                   .getDefaultConfiguration();

		if (image.getColorModel().equals(graphicsConfig.getColorModel()))
			return image;

		BufferedImage compatibleImage = graphicsConfig.createCompatibleImage( image.getWidth(), 
				                        image.getHeight(), image.getTransparency());

		Graphics2D g2d = (Graphics2D) compatibleImage.getGraphics();
		g2d.drawImage(image, 0, 0, null);
		g2d.dispose();

		return compatibleImage; 
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J viel paen mit JScrollPane AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
P Swing JScrollpane AWT, Swing, JavaFX & SWT 2
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
J JScrollPane Probleme AWT, Swing, JavaFX & SWT 3
S Swing JScrollPane verliert Scrollbars AWT, Swing, JavaFX & SWT 5
D Swing JTable in JScrollpane beliebig verbreitern AWT, Swing, JavaFX & SWT 5
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
J Swing Unteren Abstand für JTable in JScrollPane festlegen AWT, Swing, JavaFX & SWT 10
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
S Swing JScrollpane und ViewPort AWT, Swing, JavaFX & SWT 4
D JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 12
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5
H jscrollpane AWT, Swing, JavaFX & SWT 12
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
A Problem mit JScrollPane in einer JScrollpane AWT, Swing, JavaFX & SWT 4
B JScrollPane Problem AWT, Swing, JavaFX & SWT 25
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
A JScrollPane AWT, Swing, JavaFX & SWT 16
C Swing JScrollPane und Scroll-Geschwindigkeit AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben