Doppelbuffer in Swing

Kai008

Erfahrenes Mitglied
Ich habe gehört, dass Swing-Komponenten standartgemäß doppelbuffern. Dennoch flimmert folgender Code:

Java:
public void run()
{
	JPanel jpanel = new JPanel();
	jpanel.setLocation(-1, -1);
	jpanel.setSize(this.jframe.getWidth() + 1, this.jframe.getHeight() + 1);
	jpanel.setBackground(Color.black);
	jpanel.setLayout(null);
	
	for(JLabel jlabel:this.labelList)
	{
		jlabel.setLocation(jlabel.getLocation());
		jpanel.add(jlabel);
	}

	this.jframe.add(jpanel);
}

JFrame:

Java:
JFrame jframe = new JFrame() {
	private static final long serialVersionUID = 1L;
	private Component component;
	public Component add(Component c)
	{
		super.add(c);
		if(this.component != null)
			this.remove(this.component);
		this.component = c;
		return(c);
	}
};

Und ich wüsste nur wie man über paint/Graphics ein Bufferimage verwendet. (bzw. BufferStrategy benutzt.)

Ach ja, und noch 2 Dinge:

1) Wie kommen Swing-Componenten an die Position von einem anderen Comp. ran? Ich habe getLocation() überschrieben und x/y-Koordinaten als Variablen. getL. intialisiert ein neues Point-Objekt mit den Koordinaten und gibt es zurück. Dennnoch muss ich vor dem Platzieren die Position über setLocation setzen (siehe for), also muss die Position irgendwie anderst zurückgegeben werden?

2) Kann jemand etwas mit dieser Exception anfangen?

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Keine Ahnung was sie bedeutet, ist aber eine von 2 die mir zu unbestimmten Zeite ausgegeben wird. Die 2. ist eine ArrayIndexOutOfBounds mit der Fehlermeldung "Child-Node is 0" oder so ähnlich, bekomme ich aber gerade nicht, deshalb auch kein Stack Trace.

Bitte helft mir, bin gerade ziemlich radlos.

Edit:

Mir ist es gelungen, einen Buffer per BS aufzubauen:

Java:
JFrame jframe = new JFrame() {
	private static final long serialVersionUID = 1L;
	private Component component;
	public Component add(Component c)
	{
		super.add(c);
		if(this.component != null)
			this.remove(this.component);
		this.component = c;
		return(c);
	}
	public void update(Graphics g)
	{
		BufferStrategy bs = this.getBufferStrategy();

		if(bs == null)
		{
			if(this.isVisible())
				this.createBufferStrategy(2);
		}
		Graphics realG = bs.getDrawGraphics();
		this.paint(realG);
		realG.dispose();
		bs.show();
	}
	public void paint(Graphics g)
	{
		super.paint(g);
		g.dispose();
	}
};

Dennoch flimmern die Objekte leicht.
Und die 2. Fehlermeldung lautet:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 0
	at java.awt.Container.getComponent(Unknown Source)
	at javax.swing.JComponent.rectangleIsObscured(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück