Repaint verhindern

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
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

Top Contributor
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

Gesperrter Benutzer
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

Top Contributor
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)

Code:
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

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


Code:
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


----------------------------------------------------
c: Konsolenfenster schließen
f: Objekte in Finalisierungswarteschlange finalisieren
g: Speicherbereinigung
h: Diese Hilfemeldung anzeigen
l: ClassLoader-Liste ausgeben
m: Speicherbelegung anzeigen
o: Protokollierung auslösen
p: Proxy-Konfiguration neu laden
q: Konsole ausblenden
r: Richtlinien-Konfiguration neu laden
s: System- und Bereitstellungseigenschaften ausgeben
t: Threadliste ausgeben
v: Thread-Stack ausgeben
x: ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------

java.lang.NullPointerException
at LeftPane.callStart(Fenster.java:64)
at Fenster.init(Fenster.java:1
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Weiß jemand woran das liegt?
 

The_S

Top Contributor
ja auch. Aber noch ein anderes, war dort ein bisschen besser und auf Deutsch erklärt, aber grundsätzlich das selbe. Warum?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben