Aktualisierung des JPanels funktioniert nicht...

Hallo,

ich habe eine Klasse Test, die von JPanel erbt. Diese Test-Klasse wird in ein JFrame gesteckt.

So, in der Test-Klasse gibt es nun eine Funktion paintComponent(Graphics g) mit der ich auf dem JPanel Rechtecke zeichne.

Zusätzlich implementiert die Test-Klasse zu Testzwecken noch MouseListener und MouseMotionListener. Diese sind quasi in der Klasse implementiert und sollen bei Mausklick das gesamte Bild (JPanel) neuzeichnen.

Das wollte ich mit der repaint()-Methode tun aber das Fenster will sich einfach nicht neuzeichnen.

Woran liegts? Wäre froh, wenn mir jemand helfen könnte.

Vielen DanK!
 
wie gesagt, reiner Testcode... und als Ergänzung: Zurzeit male ich vor jedem Zeichenaufruf einfach die Fläche komplett weiß aus, was ich wenig elegant finde...

Und als weiteres Problem ergibt sich zudem , dass ich immer erst die Fenstergröße verändern muss, damit er überhaupt was zeichnet...

PHP:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.*;

public class Test extends JPanel implements MouseMotionListener, MouseListener {

	private boolean startDrag;
	private Collection<TestObject> liste;
	
	private int diff_x = 0;
	private int diff_y = 0;
	
	public Test() {
		
                liste = new ArrayList<TestObject>();
				
		addMouseMotionListener(this);
		addMouseListener(this);
		
		
	}	
			
	
	public void mouseMoved(MouseEvent e) {
				
				for ( TestObject test : liste ) {
				
					if (test.contains(e.getPoint())) {
						
						test.drag = true;
						
						test.setColor(new Color(0,200,0));
						
						
						
						
					} else {
						
						test.drag = false;
						
						test.setColor(new Color(200,0,0));
						
					}
				
				}
				this.repaint();
			}

			public void mouseDragged(MouseEvent e){
					
				
				
				for ( TestObject test : liste ) {
					
					if (test.drag) {
						
						test.setColor(new Color(0,0,200));
						test.setLocation(e.getX()-diff_x, e.getY()-diff_y );
						
						
					}
				
				}
				this.repaint();
			}
			
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
			public void mousePressed(MouseEvent e) {
				for ( TestObject test : liste ) {
					
					if (test.contains(e.getPoint())) {
						
						diff_x = e.getX() - test.getX();
						diff_y = e.getY() - test.getY();
										
					} 
				
				}
				
				
			}
			public void mouseClicked(MouseEvent e) {
				
				boolean del = false;
				TestObject ob = null;
				
				for ( TestObject test : liste ) {
					
					if (test.contains(e.getPoint())) {
						
						ob = test;
						del = true;
					}
						
				}
				liste.remove(ob);
				if 	(!del) liste.add(new TestObject(e.getX(), e.getY(), 50, 50));						
				repaint();
				
			}
			public void mouseReleased(MouseEvent e) {}
		
		
		
		
	
	
	public void paintComponent(Graphics g) {
			
			Graphics2D g2d = (Graphics2D) g;
			g2d.setColor(Color.WHITE);
			g2d.fillRect(0, 0, getWidth(), getHeight());
			
			for ( TestObject test : liste ) {
				g2d.setColor(test.getColor());
				g2d.fill(test.getRect());
			}
			
	}
		
		
	

	public static void main(String[] args) {
		JFrame f = new JFrame("moin");
		f.setSize(800, 600);
		f.setVisible(true);
		//f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.add(new Test());
	}
}
 
sorry, na klar...

PHP:
import java.awt.*;
import java.awt.event.*;

public class TestObject {

	
	public boolean drag = false;
	private Rectangle bound;
	private Color color;
	
	public TestObject(int px, int py, int w, int h) {
		
		bound = new Rectangle(px, py, w, h);
		color = new Color(200, 0, 0);
	}
		
	public boolean contains(Point p) {
		
		return bound.contains(p);
	}
	
	public void setColor(Color c) {
		
		color = c;
	}
	
	public Color getColor() {
		
		return color;
		
	}
	
	public int getX() {
	
		return bound.x;
			
	}
	
	public int getY() {
		
		return bound.y;
	}
	
	public Rectangle getRect() {
		
		return bound;
	}
	
	public void setLocation(double x, double y) {
		
		bound.setLocation((int) Math.round(x), (int) Math.round(y));
		
	}
		
	
}
 
Erster grober Fehler: setVisible() muss ganz zum Schluss stehen? Dann klappt es auch mit dem weißen Hintergrund.

Vg Erdal
 
Quadrate einfügen und löschen klappt dann auch!

Das wars doch was do vorhattest oder. Einfach in der main setvisible() ganz zum Schluss hinschreiben, das wars.

Vg Erdal
 
Danke.

Aber damit ist nur der Start behoben. Es funktioniert jetzt, dass er gleich am Anfang malt.

Angenommen ich würde das weiße Quadrat weglassen. Zeichne ich nun ein paar Rechtecke und verschiebe sie, ziehen sie eine Spur hinter sich her, das JPanel zeichnet zwar neu, entfernt aber nicht vorher gezeichnetes.

Es muss doch einen Befehl geben, damit der sich neu zeichnet... oder?

Danke.
 
Wieso möchtest du das weiße Quadrat weglassen. Anstatt fillRect() könntest du clearRect() benutzen. Ansonsten klappt es doch so.

Vg Erdal
 
ja, wenns nich anders geht, mach ichs so.

Ich dachte nur, dass Java einen eigenen Befehl zum "Neuzeichen" hat, was für mich bedeutet, dass die "alten" Sachen gelöscht werden.

Neuzeichnen würde dann bei Java nur bedeuten, dass er nochmal die paint()-Methode aufruft?

Naja, okay. Dann bedank ich mich : )
 
Zurück