paintComponent wird nicht aufgerufen

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
Guten Abend,
Ich habe 2 Klassen,
Klasse A mit Frame, Panel, MouseListener,
Klasse B mit panel und paintComponent.

Nun möchte ich, dass ich 2x auf das Frame von Klasse A klicken kann und mir die Klasse B dann einen Strich zeichnet. Leider funktioniert das nur, wenn ich im Konstruktor der Klasse B ein Frame kreiere, welches ich dann gar nicht verwendet.

Hier nun die Klasse B:
Code:
public class PaintPanel extends JPanel
{
	private Line2D.Double line;
	
	public PaintPanel(Point2D.Double p1, Point2D.Double p2)
	{
		line = new Line2D.Double(p1,p2);
		JFrame frame = new JFrame("Tester");
/*		
		frame.add(this);	
		frame.setSize(200,200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
*/
		repaint();
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.draw(line);
		System.out.println("zeichnet!");
	}
	
	public JPanel getPanel()
	{
		return this;
	}
}
Falls ich wie oben im Code das JFrame ausklammere, wird die paintComponent Methode nie aufgerufen. Sonst schon und das Zeichnen funktioniert wunderbar.
Code:
 frame.setVisible(false);
wäre hier wohl weniger angebracht.. :wink:
 

Ebenius

Top Contributor
Bitte mach mal ein vollständiges, kompilier- und ausführbares Beispiel! Was Du da schreibst ergibt keinen Sinn.
 

kulturfenster

Bekanntes Mitglied
mit oder ohne s spielt keine Rolle, das Resultat bleibt gleich.

hier nun meine beiden vollständigen Klassen:
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.BorderLayout;

import java.awt.Rectangle;

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import java.awt.geom.Point2D;
import java.awt.geom.Line2D;

import java.util.ArrayList;


public class Gui extends JFrame {

	private JFrame frame;
	private JPanel paintPanel;
	private JPanel mainPanel;
	
	
	private Point2D.Double p1;
	private Point2D.Double p2;

	final private ArrayList<Point2D.Double> aop = new ArrayList<Point2D.Double>();
		
	public Gui()
	{
		mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());
	
		class MousePressListener implements MouseListener
		{
	
			public void mousePressed(MouseEvent e)
			{
				int x = e.getX();
				int y = e.getY();
				p1 = new Point2D.Double(x,y);
				aop.add(p1);
				
				if (aop.size() == 2)
				{						
					PaintPanel pp = new PaintPanel(aop.get(0),aop.get(1));
					paintPanel = pp.getPanel();
					mainPanel.add(paintPanel, BorderLayout.CENTER);
				}
			}
	
			public void mouseReleased(MouseEvent e) {}
			public void mouseClicked(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
		}
		
		MouseListener listener = new MousePressListener();
		mainPanel.addMouseListener(listener);
		
		setFrame();	
	}
	
	public void setFrame()
	{		
		this.add(mainPanel);
		this.setTitle("Shape Printer");
		this.setSize(300,300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
	}

	public static void main (String args[]) {		
		
		new Gui();
	}
}
und noch diejenige, welches den Strich zeichnen soll.
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import java.awt.geom.Point2D;
import java.awt.geom.Line2D;

import java.util.ArrayList;

public class PaintPanel extends JPanel
{
	private Line2D.Double line;
	
	public PaintPanel(Point2D.Double p1, Point2D.Double p2)
	{
		line = new Line2D.Double(p1,p2);
		JFrame frame = new JFrame("Tester");
	/*
		frame.add(this);	
		frame.setSize(200,200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
*/
		repaint();
	}
	
	public void paintComponents(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.draw(line);
		System.out.println("zeichnet!");
	}
	
	public JPanel getPanel()
	{
		return this;
	}
}
 

hdi

Top Contributor
Achso gibt es Leute die dafür paintComponents() nutzen?
Ist paintComponent nicht besser? Keine Ahnung, es ist halt JComponent, ist für ein Panel
vllt besser als eine Container-Methode?

Wo isn da der Unterschied eigentlich ???:L
 

Ebenius

Top Contributor
paintComponent ohne 's'. Die mit s zeichnet die Kinder. Das will man nicht überschreiben.
 

Ebenius

Top Contributor
Zurück zum Problem... Ich habe Deinen Code kaputt gemacht. Jetzt funktioniert's:
Code:
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Gui extends JFrame {

  private JFrame frame;
  private JPanel paintPanel;
  private JPanel mainPanel;

  private Point2D.Double p1;
  private Point2D.Double p2;

  final private ArrayList<Point2D.Double> aop =
        new ArrayList<Point2D.Double>();

  public Gui() {
    mainPanel = new JPanel();
    mainPanel.setLayout(new BorderLayout());

    class MousePressListener implements MouseListener {

      public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        p1 = new Point2D.Double(x, y);
        aop.add(p1);

        if (aop.size() == 2) {
          PaintPanel pp = new PaintPanel(aop.get(0), aop.get(1));
          paintPanel = pp.getPanel();
          mainPanel.add(paintPanel, BorderLayout.CENTER);
          mainPanel.revalidate();
          mainPanel.repaint();
        } else if (paintPanel != null) {
          paintPanel.repaint();
        }
      }

      public void mouseReleased(MouseEvent e) {}

      public void mouseClicked(MouseEvent e) {}

      public void mouseEntered(MouseEvent e) {}

      public void mouseExited(MouseEvent e) {}
    }

    MouseListener listener = new MousePressListener();
    mainPanel.addMouseListener(listener);

    setFrame();
  }

  public void setFrame() {
    this.add(mainPanel);
    this.setTitle("Shape Printer");
    this.setSize(300, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

  }

  public static void main(String args[]) {

    new Gui();
  }
}

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintPanel extends JPanel {

  private Line2D.Double line;

  public PaintPanel(Point2D.Double p1, Point2D.Double p2) {
    line = new Line2D.Double(p1, p2);
  }

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLUE);
    g2.draw(line);
    System.out.println("zeichnet!");
  }

  public JPanel getPanel() {
    return this;
  }

  public static void main(String[] args) {
    PaintPanel pp =
          new PaintPanel(new Point2D.Double(10, 20), new Point2D.Double(50,
                60));
    JFrame frame = new JFrame("tester2");
    JPanel panel = new JPanel();
    panel = pp.getPanel();
    frame.add(panel);
    frame.setSize(200, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }

}

Wichtig sind Zeilen 38 bis 41! [ edit ]Bezieht sich auf den ersten Code-Block in dieser Antwort!

Ebenius
 

André Uhres

Top Contributor
Etwas vereinfacht könnte es auch so gehen:
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
public class Gui extends JFrame {
    public Gui() {
        super("Shape Printer");
        setSize(300, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new PaintPanel(), BorderLayout.CENTER);
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class PaintPanel extends JPanel {
    final private List<Point> aop;
    public PaintPanel() {
        aop = new ArrayList<Point>();
        MouseListener listener = new MousePressListener();
        addMouseListener(listener);
    }
    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        Point p1 = null;
        for (Point p : aop) {
            if (p1 == null) {
                p1 = p;
            } else {
                g.drawLine((int) p1.x, (int) p1.y, (int) p.x, (int) p.y);
                p1 = null;
            }
        }
    }
    class MousePressListener extends MouseAdapter {
        @Override
        public void mousePressed(final MouseEvent e) {
            aop.add(new Point(e.getX(), e.getY()));
            repaint();
        }
    }
}
 

Ebenius

Top Contributor
Da fällt mir grad ein, dass es ─ in beiden Beispielen ─ immer nur eine Linie geben wird. Wer findet raus warum?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G paintComponent wird nicht ausgeführt Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
H Programmaufbau in Ordnung? Problem mit paintComponent() Java Basics - Anfänger-Themen 10
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
S Rectangles ausserhalb der paintComponent drawen! Java Basics - Anfänger-Themen 9
M Problem mit paintComponent Java Basics - Anfänger-Themen 6
M PaintComponent Java Basics - Anfänger-Themen 9
J Wer oder was ruft die "paintComponent()" Methode auf? Java Basics - Anfänger-Themen 19
K paintComponent Java Basics - Anfänger-Themen 23
K paintComponent Java Basics - Anfänger-Themen 9
kulturfenster Frage bez paintComponent Java Basics - Anfänger-Themen 5
kulturfenster super.paintComponent(g); Java Basics - Anfänger-Themen 3
G fehler bei paintComponent Java Basics - Anfänger-Themen 6
kulturfenster paintComponent und Timer Java Basics - Anfänger-Themen 2
W Weitere Parameter in die paintComponent()-Methode übergeben? Java Basics - Anfänger-Themen 7
ElViZ paintComponent in den Vordergrund? Java Basics - Anfänger-Themen 2
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
M paintComponent() in abstrakter und vererbender Klasse Java Basics - Anfänger-Themen 3
G paintComponent(Graphics g) Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
G paintComponent neu zeichnen Java Basics - Anfänger-Themen 5
S paintComponent, neue Instanz überschreibt wohl alte Instanz Java Basics - Anfänger-Themen 6
G Exception in PaintComponent Java Basics - Anfänger-Themen 2
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
G probleme mit paintComponent Java Basics - Anfänger-Themen 14
M Probleme mit JPanel und paintComponent Java Basics - Anfänger-Themen 3
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
el_pato DialogFenster wird nicht in Schleife geöffnet? Java Basics - Anfänger-Themen 30
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
X compareTo Methode wird ignoriert Java Basics - Anfänger-Themen 7
kodela Hauptklasse wird nicht gefunden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben