paint-Methode aufrufen

andi11

Mitglied
Hallo zusammen,
ich befasse mich erst seit kurzen mit Java und verstehe nicht wann jeweils die Methode “paint“ aufgerufen wird. Bisher habe ich das unten stehende Programm erstellt. Mit dem Debugger sehe ich, dass „paint“ bei Aufruf von „this.setVisible(true);“ ausgeführt wird. Warum? Zudem wird es 2 Mal hintereinander ausgeführt.
Des Weiteren möchte ich die „paint“-Methode in eine neue Klasse legen und dann von außen aufrufen. Wie funktioniert das? Ich habe es bereits mit repaint() versucht, aber es hat nicht funktioniert.

--------------------------
Java:
package Pack1;

public class Start {
   public static Fenster Fenster;

   public static void main(String[] args) throws Exception{    
     Fenster = new Fenster();
     Fenster.FensterErstellen();
     Fenster.ButtonErstellen();
   }
}

-------------------------
Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Fenster extends JFrame implements ActionListener{
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;  
  
   public Fenster () {
     super("Test");
   }

   public void FensterErstellen() {
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     this.setSize(1000,800);
     this.setLayout(null);
     this.setVisible(true);
   }
    
   public void ButtonErstellen () {    
     VonRechts = new JButton("Von rechts");
     VonRechts.setBounds(72, 700, 160, 40);
     VonRechts.addActionListener(this);
     add(VonRechts);
    
     VonLinks1 = new JButton("Von links1");
     VonLinks1.setBounds(304, 700, 160, 40);
     VonLinks1.addActionListener(this);
     add(VonLinks1);
    
     VonLinks2 = new JButton("Von links2");
     VonLinks2.setBounds(536, 700, 160, 40);
     VonLinks2.addActionListener(this);
     add(VonLinks2);
    
     Schliessen = new JButton("Schließen");
     Schliessen.setBounds(768, 700, 160, 40);
     Schliessen.addActionListener(this);
     add(Schliessen);    
   }

   public void paint (Graphics g){
     super.paint(g);
     g.setColor(new Color(100,100,250));
     g.fillRect(50, 50, 100, 100);
     System.out.println("paint");
   }

   @Override
   public void actionPerformed(ActionEvent arg0) {
     // TODO Auto-generated method stub    
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
... verstehe nicht wann jeweils die Methode “paint“ aufgerufen wird. Bisher habe ich das unten stehende Programm erstellt. Mit dem Debugger sehe ich, dass „paint“ bei Aufruf von „this.setVisible(true);“ ausgeführt wird. Warum?

Weil du ja sagst er soll das Fenster sichtbar machen, dazu muss er was zeichnen. Irgendwo in den Java Klassen wird dann eben die "paint" Methode aufgerufen.

Zudem wird es 2 Mal hintereinander ausgeführt.

Wieso 2x hintereinander? Nur weil du dazwischen keine andere Ausgabe hast? Heißt ja nur das dazwischen keine andere Ausgabe passiert ;)
Aber nicht das es direkt hintereinander aufgerufen wird.

Des Weiteren möchte ich die „paint“-Methode in eine neue Klasse legen und dann von außen aufrufen. Wie funktioniert das? Ich habe es bereits mit repaint() versucht, aber es hat nicht funktioniert.

Was heißt du willst diese Methode in eine andere Klasse legen? Wozu? Was erhoffst du dir davon?
 
K

kneitzel

Gast
Separation of Concerns - pack Dinge immer da hin, wo es hin gehört und Trenne Dinge, die nicht zusammen gehören.

Du hast ein JFrame - wo soll das Malen des Fensters hin gehören, wenn nicht in die vom JFrame abgeleitete Klasse?

Der Inhalt kann woanders erstellt werden, das ist egal. Da ist evtl. der Vergleich mit der Textausgabe hilfreich:
Die Ausgabe ist da, wo sie hin gehört. Also z.B. die Funktion println auf dem Stream der hinter System.out steckt. Was angezeigt wird, ist in den eigentlichen Objekten drin. Eine Klasse hat z.B. eine Funktion toString.

So kannst du auch Dinge trennen. Dann hast Du Objekte, die wissen, wie sie dargestellt werden können, aber die eigentliche Darstellung übernimmt das JFrame.

Der Vergleich mit dem Stream hinkt etwas, denn Du hast bei Swing nicht die aktive Darstellung wie beim System.out.println, sondern Du hast halt die typische Window-Applikation mit Event-Loop und darüber wird ein Fenster aufgefordert sich zu malen. Du änderst also nur Inhalte und triggerst dann das neumalen. Daher hat man oft eine Zweiteilung: Ein Objekt mit Daten und ein Objekt zum Anzeigen. Und diese sind über ein Binding miteinander verbunden ...

Hoffe, dass hat jetzt nicht nur verwirrt.
 

andi11

Mitglied
Ich sehe teilweise, dass mit paintComponent gearbeitet wird und dieses in eine separate Klasse gelegt wird mit der Vererbung der Klasse JPanel (extends JPanel). Ich habe ja schon JFrame vererbt, ich kann ja nicht 2 Klassen vererben. Deshalb lege ich „paint“ in eine neue Klasse und rufe sie an irgendeiner Stelle von meiner Klasse „Fenster „auf.
An welcher Stelle genau soll ich die neue Klasse „Zeichen“ aufrufen.
Ich habe es wie folgt versucht, aber es hat nicht funktioniert.

------------------------------------
Aufruf mit
Zeichnen Zeichnen = new Zeichnen ()

---------------------------------
Java:
package Pack1;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;


public class Zeichnen extends JPanel {

   public void paintComponent (Graphics g){
     super.paintComponent(g);
     g.setColor(new Color(100,100,250));
     g.fillRect(50, 50, 100, 100);  
  }  
}
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Einfach nur ein Objekt dieser Klasser erstellen reicht nicht, du musst es natürlich noch deinem JFrame hinzufügen.
Java:
frame.add(new Zeichnen());
 

andi11

Mitglied
Leider will es nicht funktionierten. Bitte schau dir nochmal den Programmcode an und korrigiere ihn.

Java:
package Pack1;

public class Start {

   public static Fenster Fenster;

   public static void main(String[] args) throws Exception{
   
     Fenster = new Fenster();
     Fenster.FensterErstellen();
     Fenster.ButtonErstellen();
   }
}
-------------------------------------------------------
Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Fenster extends JFrame implements ActionListener{

   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen; 
 
   public Fenster () {
     super("Test");
   }

   public void FensterErstellen() {
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     this.setSize(1000,800);
     this.setLayout(null);
     this.setVisible(true);
   }
   
   public void ButtonErstellen () {
   
     VonRechts = new JButton("Von rechts");
     VonRechts.setBounds(72, 700, 160, 40);
     VonRechts.addActionListener(this);
     add(VonRechts);
   
     VonLinks1 = new JButton("Von links1");
     VonLinks1.setBounds(304, 700, 160, 40);
     VonLinks1.addActionListener(this);
     add(VonLinks1);
   
     VonLinks2 = new JButton("Von links2");
     VonLinks2.setBounds(536, 700, 160, 40);
     VonLinks2.addActionListener(this);
     add(VonLinks2);
   
     Schliessen = new JButton("Schließen");
     Schliessen.setBounds(768, 700, 160, 40);
     Schliessen.addActionListener(this);
     add(Schliessen);
   
     this.add(new Zeichnen());
   }

   @Override
   public void actionPerformed(ActionEvent arg0) {
     // TODO Auto-generated method stub
   
   }
}
-------------------------------------------------------
Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Zeichnen extends JPanel {

   public void paintComponent (Graphics g){
     super.paintComponent(g);
     g.setColor(new Color(100,100,250));
     g.fillRect(50, 50, 100, 100);
 
  } 
}
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Wenn Du ein eigenes Panel hast, dann musst Du da - so wie für jedes Control, dass Du hinzugefügt hast, doch die Position und Größe setzen. Sprich: So wie du für die anderen Controls setBounds aufgerufen hast, musst Du dies auch für Deine Klasse Zeichnen machen.

Für Dein Verständnis: Du hast da halt jetzt ein eigenes, neues Control "Zeichnen" erstellt. Und das musst Du natürlich so wie jedes Control verwenden.

Konrad
 

andi11

Mitglied
Also setze ich jetzt wie folgt "setBounds" ein, aber es funktioniert nicht, warum?


Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Zeichnen extends JPanel {

   public void paintComponent (Graphics g){
     super.paintComponent(g);
   
     this.setBounds(50, 50, 100, 100);
     g.setColor(new Color(100,100,250));
     g.fillRect(50, 50, 100, 100);
 
  } 
}

Ist das so richtig mit dem Code-Tag?
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Also ich mache nicht viel auf Clientseite aber setBounds gibt die Position im Parent an. Aber beim Malen gelten die Koordinaten des controls selbst. Damit malst Du jetzt ausserhalb des sichtbaren Bereiches.

Wäre jetzt zumindest meine Vermutung....
 

andi11

Mitglied
Hallo zusammen,
ich habe immer noch Probleme mit paintComponent (siehe folgendes Beispiel).
Warum wird das Rechteck nicht gezeichnet?
Habe außerdem JFrame in JApplet geändert, da ich ein Applet erstellen will.

Java:
package Pack1;   

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class StartNeu extends JApplet{

   private JPanel p;
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;
   
   public void init(){

     setSize(1000,800);
     p = new JPanel();
     p.setLayout(null);
     this.setContentPane(p);
     
     VonRechts = new JButton("Von rechts");
     VonLinks1 = new JButton("Von links1");
     VonLinks2 = new JButton("Von links2");
     Schliessen = new JButton("Schließen");
     
     add(VonRechts);
     add(VonLinks1);
     add(VonLinks2);
     add(Schliessen);
     
     VonRechts.setBounds(72, 750, 160, 40);
     VonLinks1.setBounds(304, 750, 160, 40);
     VonLinks2.setBounds(536, 750, 160, 40);
     Schliessen.setBounds(768, 750, 160, 40);
     
     Zeichnen = new Zeichnen();
     this.getContentPane().add(Zeichnen);
     this.setVisible(true);
   }

----------------------------
package Pack1;

import java.awt.*;
import java.awt.Graphics;
import javax.swing.JPanel;


public class Zeichnen extends JPanel {

   
   public Zeichnen ()
   {
   }
   
   public void paintComponent (Graphics g){
     
     super.paintComponent(g);
     g.setColor(new Color(100,100,250));
     g.fillRect(50, 50, 100, 100);
  }   
}
 

andi11

Mitglied
Hallo zusammen,
um die unterschiedlichen Möglichkeiten kennenzulernen würde mich außerdem interessieren, wie das ganze aussehen muss, wenn die Methode "paintComponent" in die Klasse "StartNeu" gelegt wird. Gibt es auch eine Möglichkeit ohne die paintComponent Methode zu zeichnen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9
N paint Methode im JFrame AWT, Swing, JavaFX & SWT 3
T Paint-Methode geht nicht AWT, Swing, JavaFX & SWT 5
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
B paint methode wiederholen AWT, Swing, JavaFX & SWT 6
G Problem mit paint Methode und Buttons AWT, Swing, JavaFX & SWT 10
T JPanel - paint Methode?, aber wie AWT, Swing, JavaFX & SWT 13
K paint-Methode überschrieben - trotzdem JComponenten zeichnen AWT, Swing, JavaFX & SWT 5
bummerland paint Methode AWT, Swing, JavaFX & SWT 2
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben