Swing JPanels werden ständig gezeichnet

JensArpe

Mitglied
Hey,

ich habe eine Applikation in Swing geschrieben. Es werden unter anderem 3 Panels hinzugefügt, auf denen ich die paintComponent()-Methode überschreibe um darauf zu zeichnen. Das Zeichnen beginnt allerdings erst, wenn ich auf einen Knopf drücke. Klappt auch alles wunderbar. Nur bin ich jetzt durch ein zufälliges System.out darauf gestoßen, daß bei allen 3 Panels die ganze Zeit die paintComponent-Methode aufgerufen wird. Und das obswohl ich nichts mache.. Das Zeichnen startet erst wenn ich auf den Knopf drücke.. Das Fenster wird nicht verändert.. Ich starte das Programm und gut wars..

Ist es normal, daß paintComponent die ganze Zeit aufgerufen wird? So wie ich es verstanden habe, wird das ja eigentlich nur ausgelöst, wenn auch wirklich die Notwendigkeit besteht es nochmal neu zu zeichen.

Oder was könnte sonst noch der Grund dafür sein?

Wäre für jede Anregung dankbar.
 
Ist es normal, daß paintComponent die ganze Zeit aufgerufen wird?
Nein.
So wie ich es verstanden habe, wird das ja eigentlich nur ausgelöst, wenn auch wirklich die Notwendigkeit besteht es nochmal neu zu zeichen.
Prinzipiell: Ja.
Oder was könnte sonst noch der Grund dafür sein?
Dein Vorgehen beim Zeichnen ist falsch. Ohne Code kann man aber nicht viel dazu sagen.
 
Ok..

paintComponent in meinem Panel:

Java:
public class GesamtansichtPanel extends JPanel implements MouseListener {
...
 protected void paintComponent(Graphics g) {       
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        setFont(new Font("Verdana", 12, 12));
        g2.drawString(String.valueOf(stammdate.getInterneGatewayID()), 5, 15);
        g2.drawString(String.valueOf(stammdate.getBezeichnung()), 5, 45);
        g2.draw(new Line2D.Double(0, 20, getWidth(), 20));
    }
...
}


und die werden dann in meinem Hauptfenster einem Panel hinzugefügt und angezeigt. (Was auch geht... nur wird halt ständig neu gezeichnet). Untenstehender Code ist teil einer Funktion, die nur einmal aufgerufen wird, wenn ich nen Knopf drücke.

Java:
...
for (i = 0; i < tempList.size(); i++) {
            Stammdaten tempList2 = (Stammdaten) tempList.get(i);
            GesamtansichtPanel temp = new GesamtansichtPanel(tempList2);
            temp.setSizeOwn((int) panelsizeXaktuell, (int) panelsizeYaktuell);
            temp.setBorder(new EtchedBorder(Color.white, Color.black));
            temp.setZustandsfarbe(1);
            temp.addMouseListener(temp);
            temp.setToolTipText("Bezeichnung : " + tempList2.getBezeichnung() + "\n" + " Baujahr: " + tempList2.getBaujahr());
            jPanel12.add(temp);
            panelArrayList.add(temp);
 }
 jPanel12.updateUI();
...

hoffe das hilft weiter
 
Java:
GesamtansichtPanel temp = new GesamtansichtPanel(tempList2);
 temp.addMouseListener(temp);

ich behaupte mal, das liegt daran...
 
Ich habe grade mal getestet. Die Schleife wird nur genau 2 mal durchlaufen. Den MouseListener hab ich mal auskommentiert. Aber immer noch mit dem selben Ergebniss.
 
Hier mal ein TestProgramm:


Die Klasse zeigt das Fenster an und malt dann das Panel drauf.

Java:
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame {
	JPanel jPanel12;
	static int f = 0;

	public MainFrame() {
		jPanel12 = new JPanel();
		this.add(jPanel12);
		this.setSize(200, 200);
		for (int i = 0; i < 2; i++) {
			System.out.println(f++);
			GesamtansichtPAnel temp = new GesamtansichtPAnel();
			temp.addMouseListener(temp);
			temp.setToolTipText("Bezeichnung : \n Baujahr: ");
			jPanel12.add(temp);
		}
		jPanel12.updateUI();
	}
	
	public static void main(String[] args) {		
		java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MainFrame().setVisible(true);
            }
        });
	}
}

Das Panel:

Java:
import java.awt.Color;
import java.awt.Event;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Line2D;
import javax.swing.JPanel;

public class GesamtansichtPAnel extends JPanel implements MouseListener {   

    public void mouseClicked(MouseEvent me) {
        if (me.getClickCount() == 2) {
            System.out.println("doppelKlick");
        } else {
        	System.out.println("einfachKlick");
        }
    }

    public void mouseExited(MouseEvent me) {
    }

    @Override
    public boolean mouseDown(Event event, int i, int i1) {
        return super.mouseDown(event, i, i1);
    }

    @Override
    public boolean mouseDrag(Event event, int i, int i1) {
        return super.mouseDrag(event, i, i1);
    }

    @Override
    public boolean mouseExit(Event event, int i, int i1) {
        return super.mouseExit(event, i, i1);
    }

    @Override
    public boolean mouseEnter(Event event, int i, int i1) {
        return super.mouseEnter(event, i, i1);
    }

    public void mouseEntered(MouseEvent me) {
    }

    @Override
    public boolean mouseMove(Event event, int i, int i1) {
        return super.mouseMove(event, i, i1);
    }

    public void mousePressed(MouseEvent me) {
    }

    public void mouseReleased(MouseEvent me) {
    }

    @Override
    public boolean mouseUp(Event event, int i, int i1) {
        return super.mouseUp(event, i, i1);
    }

    @Override
    public void setSize(int i, int i1) {
        super.setSize(i, i1);
    }

    @Override
    protected void paintComponent(Graphics g) {
        System.out.println("GesamntPanel");
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        setFont(new Font("Verdana", 12, 12));
        g2.drawString("ID", 5, 15);
        g2.drawString("Bezeichnung", 5, 45);
        g2.draw(new Line2D.Double(0, 20, getWidth(), 20));
    }   
}


Die Ausgabe:

Code:
0
1
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel
GesamntPanel

.......

Die Schleife wird wie man sieht nur 2 mal aufgerufen. daran liegst nicht.. Aber es wird ständig paintComponent aufgerufen.


Wenn ich übringes den Teil

Java:
java.awt.EventQueue.invokeLater(new Runnable() {
 
            public void run() {
                new MainFrame().setVisible(true);
            }
        });

weglasse und nur ein neues Objekt anlege.. passiert übrigens das selbe.
 
ok, das hätte man doch auch am Original sehen können:
der setFont-Aufruf ist böse, diese Methode lautet:

Java:
    public void setFont(Font font) {
        Font oldFont = getFont();
        super.setFont(font);
        // font already bound in AWT1.2
        if (font != oldFont) {
            revalidate();
	    repaint();
        }
    }
aber mit Testprogramm ist es nur eine Frage von Minuten bis das allein schon durch Auskommentieren identifiziert ist,

noch zum Thema kurzes Testprogramm: die 400 MouseListener-Methoden wären in 30 sec gelöscht gewesen
 
Ich bin grade darauf gestoßen, daß wenn ich die Zeile

Java:
setFont(new Font("Verdana", 12, 12));

auskommentiere, dann wird es nicht die ganze Zeit neu gezeichnet.. doch..

a) warum wird es mit dem Aufruf immer neu gezeichnet?
b) hab ich noch 2 andere Panels mit dem selben Problem, da wird aber nie setFont aufgerufen.
 
siehe mein Posting zwischendurch 😉

> b) hab ich noch 2 andere Panels mit dem selben Problem, da wird aber nie setFont aufgerufen.

entweder werden die zusammen mit dem dritten mitgezeichnet oder: Testprogramm posten 😉
 
Java:
        repaint();
Das ist der Grund, warum es neugezeichnet wird.
Ein repaint stößt glaube ich die Methode paintComponent an.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben