# Paint-Methode Überschreiben macht Refresh-Fehler ?



## FinalbrainXP (23. Aug 2006)

Hi  

Habe nen kleines Problem mit dem Überschreiben der Paint-Methode. Und zwar wird mein Hintergrundbild nicht wirklich
gezeichnet. Das bedeutet es wird zwar gezeichnet..doch mit dem Refreshen..da summt mein Monitor und es flackert EXTREM. Ich weiss, das Thema mit der Paint-Methode ist überall durchgekaut, doch ich finde keine Lösung woran es liegen kann. In anderen Anwendnungen klappt sowas auch ganz ohne Probs..doch meine nun spezielle Konstellation will irgendwie nicht. Wo ist da mein Fehler ?


Vorgeschichte:

Ich benutze NUR AWT, keine SWING-Komponente, da ich später mit OPENGL aufsetzen will.

1.) Ich habe nen einfaches Frame OHNE Layout-Manager.

2.) Dann Habe ich ein Panel (Kein JPanel) auch OHNE Layout-Manager. In diesem Panel überschreibe ich die  
     Paint-Methode und lass ein Hintergrundbild zeichnen. Das Überschreiben der PaintComponent-Methode funzt hier 
     irgendiwe überhaupt nicht. Nur Das Überschreiben der Paint-Methode klappt.

3.) Diesem Panel adde ich dann ne TextArea und adde dann das Panel zum Frame. also eigentlich ne simple 
     Konstellation.

4.) Es wird auch alles korrekt gezeichnet, NUR wenn ich dann zum Beispiel Text markiere im TextArea, dann summt der 
     Monitor und es flackert alles wie verrückt. (NICHT nur die Java-applikation..ganz windows samt Desktop)
     Ich weiss, Paint-Methode überschreiben gehört verboten, aber PaintComponent klappt hier nicht.

Hier mal die relevanten Code-Auszüge:


DAS PANEL

```
import java.awt.*;

class PropertyBackground extends Panel
{
	private Image image;
	
	public PropertyBackground(Image image, int width, int height)
	{
		super();
		
		this.setBackground(Color.BLACK);
		this.image = image;
		this.setLayout(null);
		this.setBounds(0,0,width,height);
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		g.drawImage(image,0,0,image.getWidth(this), image.getHeight(this),this);	
	}
}
```

AUSZÜGE AUS DEM FRAME

```
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*; //Nur für ImageIcon

public class PropertyFrame extends Frame
{
   	private final int WIDTH = 512;
   	private final int HEIGHT = 400;
   	
   	public PropertyFrame()
   	{
		
		
		this.setLayout(null);     	
		this.setSize(WIDTH, HEIGHT);
		setBackground(Color.black);		
		centerWindow(this);
		
			
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
						
		PropertyConsole propertyCon = new PropertyConsole(WIDTH-100,HEIGHT-100);
		
		
		PropertyBackground propertyBack = new PropertyBackground(new ImageIcon("c://Test.jpg").getImage(), WIDTH, HEIGHT);
		
		propertyBack.add(propertyCon);
		
		this.add(propertyBack);
					
		this.setVisible(true);
```

HIER DIE TEXTAREA

```
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class PropertyConsole extends TextArea
{
	public final boolean LEVEL_OK    = true;
	public final boolean LEVEL_ERROR = false;
	private final String LEVEL_OK_MESSAGE = " [OK]";
	private final String LEVEL_ERROR_MESSAGE = " [FEHLER!]";
	
	public PropertyConsole(int width, int height)
	{
		super("",100,25,TextArea.SCROLLBARS_VERTICAL_ONLY);
		
		this.setBounds(16,32,width, height);
		this.setForeground(Color.yellow);
		this.setVisible(true);
		this.setBackground(Color.black);
		this.setEditable(false);
	}
```



Ich habe schon rumgedebuggt und festgestellt, das es irgendwie mit den Layoutmanagern festhängen...Habe auch schon das ganze mit Swing ausprobiert..also JPanel benutzt etc. da kommt derselbe fehler...was habe ich dummes vergessen oder falsch gemacht ?

Gruss

Final


----------



## Wildcard (23. Aug 2006)

AWT hat gar keine paintComponent Methode, klar das die nicht aufgerufen wird  :wink: 
Installier mal einen anderen Treiber für deine Grafikkarte, oder spiel ein wenig mit den Einstellungen rum, denn mit Java-Mitteln lässt sich das von dir geschilderte Verhalten gar nicht erreichen.


----------



## FinalbrainXP (23. Aug 2006)

Hmm..ja..du hast Recht, habe nachgeschaut..die PaintComponent-Methode gibt es dort nicht.
Nur habe ich immer noch das Refresh Problem. Das liegt weder an dem Grafikkartentreiber noch an meiner VM..die sind beide 100% in Ordnung. Ich habe sonst auch keine Probleme mit meinen anderen Grafikanwendungen in Java.
Ich vermute mal es liegt irgendwie am Layout-Manager, weil wenn ich ohne den Arbeite..dann kommt das Flackern nicht.
Habe herausgefunden, dass wenn ich mein Fenster mit der Maus ein wenig zur Seite Ziehe, also aufm Desktop Move sind alle Probleme danach beseitigt. Woran kann das Liegen ? Habe ich irgend ne Reihenfolge der Aufrufe falsch oder so etwas ähnliches ? Es liegt nicht an meinem System..andere AWT Anwendungen klappen superb.


----------



## Wildcard (23. Aug 2006)

Den ganzen Desktop könntest du höchstens mit Fullscreen-Modus zum Flackern bringen, sofern du das nicht benutzt tippe ich eher auf Probleme mit der Graka respektive den Treibern


----------



## FinalbrainXP (23. Aug 2006)

Hmm...könnte jemand mal das Prog bei sich testen und mir dann bescheid sagen, ob es bei euch Einwandfrei läuft ?
Kann mir das garnet mit den Treibern Vorstellen...habe den neusten NVidea-Detonator und ne Geforce 6800.
Nie Probleme gehabt. Wenns bei euch läuft, dann kann ich Programmierfehler dann endgültig ausschließen 

Hier die Class-Dateien: 

http://rapidshare.de/files/30490523/JOGL_Engine.zip.html


Einfach am win32/Linux Prompt:  Java JOGLRun




Gruss

Final


----------



## Wildcard (23. Aug 2006)

Na toll.... kein jar und keine sourcen.  :applaus:


----------



## FinalbrainXP (23. Aug 2006)

Wo ist das Prob ? Geht ohne JAR und Sourcen sind nicht Sinn dieser Übung. Wenn du Aufmerksam gelesen hättest, dann wäre dir nicht entgangen, das es mir darum geht ob es bei dir läuft, und KEINE Fehler auftreten, wenn du den TExt markierst...naja..vielleicht versteht jemand anders das Problem


----------



## FinalbrainXP (24. Aug 2006)

Hatte den Fehler noch gefunden.

Fürs Archiv:

Es handelte sich um JPG, welches in der Paintmethode mit dem Draw Befehl über den Zeichenbereich von
dem Panel hinausmalte. Habe mit setBounds() das Panel auf die größe des JPG's angeglichen und nun gehts wunderbar.

Also: Kein Treiberproblem, sondern eigene Dummheit  


Bitte Thread closen 

Thnx@all

Final


----------



## The_S (25. Aug 2006)

FinalbrainXP hat gesagt.:
			
		

> Bitte Thread closen



wird nicht geclosed, aber du kannst ihn links unten mit dem Button abhaken. Dann ist er als erledigt markiert


----------

