repaint()

kulturfenster

Grünschnabel
Hallo allerseits,
Ich habe ein 2 Fragen bezüglich repaint():
1. Gibt es eine allgemeine Regel, wann repaint() aufgerufen werden muss? Ich bin nämlich jedes Mal wieder überrascht, wenn es wieder soweit ist...
2. Ich habe Probleme mit einer Main-Methode, die mir 2 bewegende Rechtecke aus 2 Klassen darstellen soll. Mein Problem ist, dass sie immer nur das letzte Objekt anzeigt.
Hier die main-Methode:
Code:
public static void main(String[] args)
	{
		Rectangle2 r2 = new Rectangle2();
		Rectangle3 r3 = new Rectangle3();
		
		JFrame frame = new JFrame();
		frame.setSize(breite, laenge);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.add(r2);
		frame.add(r3);
		
		frame.setVisible(true);
	
	}
Es zeigt mir also nur r3 an. Wie kann ich das richten?

Vielen Dank für Tipps!
 
1. Gibt es eine allgemeine Regel, wann repaint() aufgerufen werden muss? Ich bin nämlich jedes Mal wieder überrascht, wenn es wieder soweit ist...
Immer dann, wenn du etwas verändert hast und diese Änderung sehen möchtest.

2. Ich habe Probleme mit einer Main-Methode, die mir 2 bewegende Rechtecke aus 2 Klassen darstellen soll. Mein Problem ist, dass sie immer nur das letzte Objekt anzeigt.

Dafür brauch man schon was mehr Code als nur die main.. zeig mal die Rectangel2/3 Klassen bzw. die Methoden in denen du zeichnest
 
danke erst mal für die Antwort!

ok, hier die beiden Klassen:

Code:
package timerKap11;

import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;


public class Rectangle3 extends JComponent{

	private Rectangle r = new Rectangle(5,10,50,50);
	
	public Rectangle3() 
	{
		class Mover implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				r.translate(2, 2);
				repaint();
			}
		}
		
		ActionListener listener = new Mover();
		final int DELAY = 1000;
				
		Timer t = new Timer(DELAY, listener);
		t.start();
	}
	
	public void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
		
		g2.draw(r);
	}
}
und noch hier:
Code:
package timerKap11;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Rectangle2 extends JComponent{

	private Rectangle r = new Rectangle(5,10,20,30);

	
	public Rectangle2()
	{
		class Mover implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				r.translate(1,1);
				repaint();
				
			}
		}
		
		ActionListener listener = new Mover();
		final int DELAY = 100;
		javax.swing.Timer t = new javax.swing.Timer(DELAY, listener);
		t.start();
	}
	
	public void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
			
		g2.draw(r);
	}
	
	
}
 
du fügst r2 ein und dann wird es gezeichnet (weil in sienem Konstruktor die repaint() Methode aufgerufen wird) Danach fügst du r3 hinzu und dann wird seine repaint() Methode aufgerufen und da dort das r2 nicht gezeichnet wird, wird es auch nciht mehr angezeigt ;-)
 
Moin!

Das Problem liegt darin, das du
1) deinen JFrame direkt neue Komponenten hinzufügst.
Du solltest dir merken, man fügt einem JFrame nicht direkt etwas hinzu, sondern dessem ContentPane.
2) Wird nichts angezeigt, weil sich deinen Komponenten überlagern. Ordne sie korrekt an, beispielsweise mit einem Layout, und es funktioniert auch:
Code:
public static void main(String[] args)
    {
        Rectangle2 r2 = new Rectangle2();
        Rectangle3 r3 = new Rectangle3();
        
        JFrame frame = new JFrame();
        frame.setSize(breite, laenge);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(2,1));
        frame.getContentPane().add(r2);
        frame.getContentPane().add(r3);
        
        frame.setVisible(true);
    
    }

Es sei denn du möchtest wirklich beide Rechtecke in einem Container zeichen.
Dann musst wirklich der Container, in dem die Rechtecke angezeigt werden sollen, auch beide Rechtecke zeichen.
Zum Beispiel:
Painter.java
Code:
/*
 * Painter.java
 *
 * Created on 17. Mai 2007, 18:18
 *
 *
 */

package tutorials;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JPanel;

/**
 *
 * @author JW
 */
public class Painter extends JPanel{
    Rectangle rec2 = null;
    Rectangle rec3 = null;
    /** Creates a new instance of Painter */
    public Painter() {
        
        
    }
    public void setRectangle2(Rectangle rec){
        rec2 = rec;
        repaint();
        
    }
    public void setRectangle3(Rectangle rec){
        rec3 = rec;
        repaint();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        if(rec2!= null){
            ((Graphics2D)(g)).draw(rec2);
        }
        if(rec3!= null){
            ((Graphics2D)(g)).draw(rec3);
        }
    }
    public static void main(String[] args)
    {
        Painter p = new Painter();
        Rectangle2 r2 = new Rectangle2(p);
        Rectangle3 r3 = new Rectangle3(p);
        
        JFrame frame = new JFrame();
        frame.setSize(breite, laenge);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(p);
        
        frame.setVisible(true);
    
    }
}

Rectangle 2 bzw. Rectangle3
Code:
public class Rectangle2 extends JComponent{
    
    private Rectangle r = new Rectangle(5,10,50,50);
    
    
    public Rectangle2(final Painter paint) {
        class Mover implements ActionListener {
            public void actionPerformed(ActionEvent event) {
                r.translate(2,2);
                paint.setRectangle2(r);
                
            }
        }
        
        ActionListener listener = new Mover();
        final int DELAY = 100;
        javax.swing.Timer t = new javax.swing.Timer(DELAY, listener);
        t.start();
    }
Auch wenn es für dieses Beispiel meiner Meinung nach nicht viel Sinn macht, 2 Klassen extra für die Rechtecke und deren Steuerung zu erstellen.. Aber das kann ein Programmierer ja machen wie er will ;)



*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Zurück