# Repaint verhindern



## The_S (10. Aug 2005)

Ich habe ein Applet in Form eines Fernseher. Rechts, Links, Oben und Unten ein JPanel (jeweils eine Klasse, die von JPanel erbt und mit der paintComponent()-Methode und Graphics2D gezeichnet wird) für den Rahmen und in der Mitte der Inhalt. Dieser Fernseher geht über die größe des Bildschirms, sodass man für den unteren Teil im Browser nach unten scrollen muss. Beim runterscrollen flackert das Applet. Dieses möchte ich verhindern. Habe mir gedacht, dass ich den JPanels ein setIgnoreRepaint mitgebe, hilft aber auch nichts.

[edit] und zwar immer, wenn über oder unter dem Applet kein Freiraum ist, also wenn das Applet sich über mehr als das komplette vertikale Sichtfeld des Users zieht


----------



## The_S (11. Aug 2005)

Ein bekannter hat gemeint, ich sollte mal DoubleBuffering ausprobieren. Hab ich dann auch gemacht, aber des hat auch nix gebracht (oder ich war zu dem es anzuwenden :wink: ). Könnte sich das Problem echt mit double Buffering lösen oder bin ich total auf den falschen weg?

btw: *push* :wink:


----------



## L-ectron-X (11. Aug 2005)

DoubleBuffering könnte das Problem beheben. Ich bin mir jetzt nicht 100%ig sicher, aber ich glaub ein JPanel untestützt standardmäßig DoubleBuffering.


----------



## The_S (11. Aug 2005)

Im JPanel befinden sich zwei selbst gezeichnete, von JPanel erbende Komponenten, welche Flackern. Das JEditorPane in der Mitte hingegen flackert nicht. Ich post jetzt einfach ma den Code vielleicht kann ja mal jemand drüberschauen (is ja net viel)


```
import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*;
import java.awt.event.*; 
import java.net.*; 
import java.io.*;

public class Fenster extends JApplet implements HyperlinkListener { 

	static JEditorPane edit = new JEditorPane(); 
	LeftPane left = new LeftPane(); 
	RightPane right = new RightPane(); 
	JPanel mainPane = new JPanel(); 
	JScrollPane scroll = new JScrollPane(edit); 
	 
	public void init() { 
		 
		edit.setEditable(false); 
		edit.addHyperlinkListener(this);
		left.setPreferredSize(new Dimension(25, 610)); 
		right.setPreferredSize(new Dimension(25, 610)); 
		mainPane.setLayout(new BorderLayout()); 
		mainPane.add(left, BorderLayout.WEST); 
		mainPane.add(right, BorderLayout.EAST); 
		mainPane.add(scroll);
		try {
			edit.setPage(new URL(getCodeBase(), "go_Home.html"));
			edit.getPage();
		}
		catch (IOException e) {
			System.out.println(e);
		}
		setContentPane(mainPane); 
	}
	
	public void hyperlinkUpdate(HyperlinkEvent hyl) {
		
		if (hyl.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
			try {
				if (hyl.getDescription().startsWith("http://")) {
					getAppletContext().showDocument(new URL(hyl.getDescription()), "_blank");
				}
				else {
					edit.setPage(new URL(getCodeBase(), hyl.getDescription()));
					edit.getPage();
				}
			}
			catch(IOException e) {
				System.out.println(e);
			}
		}
	}
} 

class LeftPane extends JPanel { 
	 
	public void paintComponent(Graphics comp) { 
		 
		Graphics2D comp2D = (Graphics2D)comp; 
		comp2D.setColor(new Color(120, 0, 0)); 
		comp2D.fillRect(0, 0, 25, 610); 
		comp2D.setColor(Color.black); 
		comp2D.fillRoundRect(0, 0, 50, 610, 610, 610); 
	} 
} 

class RightPane extends JPanel { 
	 
	public void paintComponent(Graphics comp) { 
		 
		Graphics2D comp2D = (Graphics2D)comp; 
		comp2D.setColor(new Color(120, 0, 0)); 
		comp2D.fillRect(0, 0, 25, 610); 
		comp2D.setColor(Color.black); 
		comp2D.fillRoundRect(-25, 0, 50, 610, 610, 610); 
	} 
}
```

BTW: Die Komponenten oben und unten wurden entfernt.


----------



## The_S (11. Aug 2005)

Hab jetzt n Tut gefunden und das Ding nach gebaut. LeftPane schaut jetzt so aus:



```
class LeftPane extends JPanel { 
    
   Image gebuffered; 
   Graphics drawBuffer; 
    
   public LeftPane() { 
       
      gebuffered = createImage(25, 610); 
      drawBuffer = gebuffered.getGraphics(); 
   } 
    
   public void paint(Graphics comp) { 
       
      drawBuffer.setColor(new Color(120, 0, 0)); 
      drawBuffer.fillRect(0, 0, 25, 610); 
      drawBuffer.setColor(Color.black); 
      drawBuffer.fillRoundRect(0, 0, 50, 610, 610, 610); 
      comp.drawImage(gebuffered, 0, 0, this); 
   } 
    
   public void update(Graphics g) { 
       
      paint(g); 
   } 
}
```

Ich denke, der müsste so auch funktionieren. Nur leider bekomme ich bei 

drawBuffer = gebuffered.getGraphics(); 

eine NullpointerException 



> Java Plug-in 1.5.0_02
> Verwendung der JRE-Version 1.5.0_02 Java HotSpot(TM) Client VM
> Home-Verzeichnis des Benutzers = C:\Dokumente und Einstellungen\stkiese
> 
> ...



Weiß jemand woran das liegt?


----------



## 8ull23y3 (11. Aug 2005)

Welches Tut haste gefunden? Dieses?

http://www.realapplets.com/tutorial/DoubleBuffering.html


----------



## The_S (11. Aug 2005)

ja auch. Aber noch ein anderes, war dort ein bisschen besser und auf Deutsch erklärt, aber grundsätzlich das selbe. Warum?


----------



## 8ull23y3 (11. Aug 2005)

Nur interessehalber dacht vielleicht hast dus noch nicht gelesen.


----------



## The_S (12. Aug 2005)

Leider schon  , aber trotzdem danke :toll:


----------

