Paint Methode von JPanel aufrufen

Hallo,

ich habe vor in einer Klasse (SpielFeld) ein Raster von mehreren Quadraten zu erzeugen. Diese Quadrate sollen alle zu beginn das selbe Bild zeigen. Bis jetzt habe ich folgendes geschrieben:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.ArrayList;
import java.util.Random;
import java.awt.color.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;


public class SpielFeld extends JFrame{
	
	JPanel hauptPanel;
	JFrame hauptFenster;
	
	int spalte=20;
	int zeile=20;
	int schiffe=3;
	int felder=spalte+zeile;
		
	Image[] bilder;
	int bilderAnzahl=3;
	BufferedReader bilderLeser;
		
	
	Bild bild;
	
	
		
public static void main(String[] args){
	SpielFeld spiel = new SpielFeld();
	spiel.neuesSpiel();
	
}

public void neuesSpiel(){
	
	bilder = new Image[bilderAnzahl];
	
	//Fenster erzeugen
	hauptFenster = new JFrame("Schiffe versenken");
	hauptFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	hauptFenster.setVisible(true);
	hauptFenster.setSize(420, 450);
	hauptFenster.setLocationRelativeTo(null);
	
	
	
	
	//Bilder einlesen
	
	test =(new ImageIcon(this.getClass().getResource("1.png"))).getImage();
	bild = new Bild();
	hauptPanel = new JPanel();
	hauptFenster.add(BorderLayout.CENTER, hauptPanel);
	JButton button = new JButton("test");
	hauptPanel.add(bild);
	
	
	
	}
	

	
@Override public void paint(Graphics g){
	
	System.out.println("paint Hauptklasse");
}
	
	class Bild extends JPanel {
		
		public void paintComponent(Graphics g){
			System.out.println("paintComponent");
		}
			
		public void paint(Graphics g){
			System.out.println("paint");
			//g.drawImage(test,20,20,this);
			g.setColor(Color.blue);
			g.fillRect(10, 10, 30, 40);
				
		}
	}
		
}

Mein Problem ist, dass ich Gerne zu beginn in dem JFrame das JPanel mit den Bildern zeichnen möchte. Später soll das ganze erweitert werden und mit einem MouseListener per Mausklick die Bilder auf dem JPanel sich ändern. Wie steuere ich genau wann paint aufgerufen wird und das es auch wirklich auf dem JPanel gezeichnet wird. Muss dazu das JFrame auch refreshed werden? Habe schon einiges gelesen, steige aber leider nicht so ganz dahinter. Danke schonmal für eure Hilfe.
 
Habe die paint Methode des Frames rausgenommen. Ich verstehe nur nicht wieso nur das Frame auf geht allerdings nicht die paint Methode von der inneren Klasse Bild aufgerufen wird. Was mache ich da falsch? Oder ist das Grundsätzlich ein schlechter ansatz wie ich es mache?
 

Michael...

Top Contributor
Oder ist das Grundsätzlich ein schlechter ansatz wie ich es mache?
Ich würde mir - vor allem als Anfänger - angewöhnen bei Swing Komponenten wie Deinem JPanel ausschließlich die
Code:
paintComponent(Graphics g)
zu überschreiben und darin als erstes
Code:
super.paintComponent(g)
aufzurufen.
Dass nichts zu sehen ist, liegt daran, dass Deine Komponente "Bild" ein Größe von 0x0 besitzt. Dein JPanel
Code:
hauptPanel
verwendet default ein FlowLayout, das sich an der
Code:
PreferredSize
der Komponenten orientiert.
Entweder der Komponente eine Größe zuweisen, oder - da das vermutlich ein Memory oder ähnliches werden soll - dem hauptPanel ein GridLayout mit dem entsprechenden Raster zu weisen.
 

Marco13

Top Contributor
Oh ja, bei der Klasse hast du auch paint überschrieben. Auch dort sollte ggf. ein super.paint(g) drin stehen, aber besser ist, was Michael... schon gesagt hat: NUR die paintComponent überschreiben (und da drin ein super.paintComponent(g) als erste Zeile). Schau dir auch mal der verlinkte Beispiel an.
 
also erst mal danke. Habe es jetzt so abgeändert, dass ich nur noch ein JPanel habe. Soweit funktioniert es. Allerdings habe ich noch Fragen. Es wird immer nur die Paint Methode aufgerufen und nicht die PaintComponent. Warum? Außerdem habe ich mit Eclipse das Problem das beim ausführen des Codes mal die paint Methode aufgerufen wird und mal nicht. so ca. jedes zweite mal wenn ich den Code ausführe. Das dasrf doch nicht sein. Weiß jemand von euch vielleicht woran das liegen könnte. Ziemlich merkwürdig.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.ArrayList;
import java.util.Random;
import java.awt.color.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;


public class SpielFeld{
	
	JFrame hauptFenster;
	
	int spalte=20;
	int zeile=20;
	int schiffe=3;
	int felder=spalte+zeile;
		
	Image[] bilder;
	int bilderAnzahl=3;
	BufferedReader bilderLeser;
		
	Image test;
	Bild bild;
	
	
		
public static void main(String[] args){
	SpielFeld spiel = new SpielFeld();
	spiel.neuesSpiel();
	
}

public void neuesSpiel(){
	
	bilder = new Image[bilderAnzahl];
	
	//Fenster erzeugen
	hauptFenster = new JFrame("Schiffe versenken");
	hauptFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	hauptFenster.setVisible(true);
	hauptFenster.setSize(420, 450);
	hauptFenster.setLocationRelativeTo(null);
	hauptFenster.setLayout(new BorderLayout());
	
	
	
	//Bilder einlesen
	test =(new ImageIcon(this.getClass().getResource("1.png"))).getImage();
	bild = new Bild();
	hauptFenster.getContentPane().add(BorderLayout.CENTER, bild);
	
		
	}
	
	class Bild extends JPanel {
		
	@Override public void paintComponent(Graphics g){
		super.paint(g);	
		System.out.println("paintComponent");
		}
		
		
		@Override public void paint(Graphics g){
			super.paintComponent(g);
			System.out.println("paint");
			g.drawImage(test,20,20,this);
			//g.setColor(Color.blue);
			//g.fillRect(10, 10, 30, 40);
			
			
		}
	}
	
		
}
 

njans

Top Contributor
Öhm wieso rufst du in der Paint() die paintComponent() auf udn umgekehrt? :eek:
Das macht so wenig Sinn ;)
Sorge mal dafür, dass der super Aufruf immer nur die Methode aufruft in der er auch steht.
 

André Uhres

Top Contributor
Hallo javabeginner21,

herzlich willkommen bei java-forum.org :).

Versuch's mal so:
Java:
import java.awt.*;
import javax.swing.*;
public class SpielFeld {
    private JFrame hauptFenster;
    private Image test;
    private Bild bild;
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            @Override
            public void run() {
                SpielFeld spiel = new SpielFeld();
                spiel.neuesSpiel();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
    public void neuesSpiel() {
        //Fenster erzeugen
        hauptFenster = new JFrame("Schiffe versenken");
        hauptFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        hauptFenster.setSize(420, 450);
        hauptFenster.setLocationRelativeTo(null);
        hauptFenster.setLayout(new BorderLayout());
        //Bilder einlesen
        test = (new ImageIcon(this.getClass().getResource("1.png"))).getImage();
        bild = new Bild();
        hauptFenster.getContentPane().add(BorderLayout.CENTER, bild);
        hauptFenster.setVisible(true);
    }
    private class Bild extends JPanel {
        @Override
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);
            g.drawImage(test, 20, 20, this);
        }
    }
}
Gruß,
André
 
Danke für den Hinweis. Hatte mich da vertan. Sollte eigentlich auch so sein wie du geschrieben hast. Verstehe im Moment nur nicht warum erst nach mehrmaligen ausführen des Programmes aus Eclipse der paintComponent aufruf funktioniert. Sehr sehr seltsam. Bin für jeden Tipp dankbar.
 
Hallo,

sorry das ich deswegen nochmals anfrage. Habe mit dem paintComponent noch Probleme. Und zwar
wird das paintComponent mehrfach aufgerufen. Leider habe ich nicht herausgefunden wieso. In dem Code wird eine zweite Klasse namens Fenster aufgerufen. Diese erstellt im Konstruktor nur ein normales Fenster. Danach wird ein Panel erstellt und dem Fenster hinzugefügt. Was mache ich nur falsch.:(

Java:
package NeueVersion;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class SpielFeld {

	int zeilen=10;
	int zeilengröße = 20;
	int spalten=10;
	int spaltengröße=20;
	int[] feld= new int[zeilen*spalten];
	
	boolean neuesSpiel=true;
	
	int bilderAnzahl =3;
	Image[] image = new Image[bilderAnzahl];
	
	
	
	
	
	
	public static void main(String[] args) {
		SpielFeld spiel = new SpielFeld();
		spiel.start();

	}
	
	public void start(){
		
		//Bilder einlesen
		for(int i=0;i<bilderAnzahl;i++){
		image[i] = (new ImageIcon(this.getClass().getResource((i)+ ".png"))).getImage();
		}
		
		//Fenster erstellen
		Fenster frame = new Fenster();
		
		Panel panel = new Panel();
		
		panel.addMouseListener(new MausListener());
		
		frame.add(panel, BorderLayout.CENTER);
		
		
		
		
		
		
		
	}
	public class Panel extends JPanel{
		
		int zelle =0;
		
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			System.out.println("neuesSpiel: "+neuesSpiel);
			if ( neuesSpiel == true){
				for (int i = 0; i< zeilen;i++ ){
					for (int j = 0; j< spalten;j++){
				//zelle = feld[(i*spalten)+j];
						g.drawImage(image[0], (i * zeilengröße), (j * spaltengröße), this);
					
					}
				}
			
			neuesSpiel = false;
			}
			
			System.out.println("paintComponent ");
			
			
			
			
		}
	}
	
	public class MausListener implements MouseListener{

		public void mouseClicked(MouseEvent arg0) {
			int x = arg0.getX();
			int y = arg0.getY();
			
			int aktuelleZeile = y /  zeilengröße;
			int aktuelleSpalte = x / spaltengröße;
			
			//System.out.println("x:"+x+" y:"+y );
			System.out.println("aktuelleZeile:"+aktuelleZeile+" aktuelleSpalte:"+aktuelleSpalte);
			
			
			
		}

		public void mouseEntered(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mouseExited(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mousePressed(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
}
 

Marco13

Top Contributor
Dass die paintComponent "oft" aufgerufen wird, ist normal. Wenn sich die Fenstergröße ändert, wenn das Fenster kurz verdeckt war, wenn irgendwoher ein repaint() aufgerufen wurde. Solange in der paintComponent NUR gezeichnet wird, sollte das kein Problem sein. Das "neuesSpiel" sollte also NICHT in der paintComponent verändert werden.
 
G

Gast2

Gast
Nur ne kleine Anmerkung:
Java:
public class Panel extends JPanel{
Klassen sollte man nie so nennen wie Klassen aus der Standard-API.
 

Exflame

Mitglied
Kann ich in der Paint-Methode auch den gewünschten Panel angeben? Ich hab hier ein Programm, das aus 6 div. Panels besteht. Auf vier Panels muss ich je eine andere Grafik erstellen (Sinus,....). :autsch:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
S awt: paint Methode zeigt nichts an Java Basics - Anfänger-Themen 9
thet1983 start & paint Methode? Java Basics - Anfänger-Themen 0
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
A Aufruf der paint() Methode Java Basics - Anfänger-Themen 3
J paint-methode blockiert settings von JComponents Java Basics - Anfänger-Themen 5
R Methoden Zeichnen auf Button-Druck durch Paint-Methode Java Basics - Anfänger-Themen 2
A paint() methode von externer Klasse aufrufen Java Basics - Anfänger-Themen 3
Q Zeichnen außerhalb der paint-methode Java Basics - Anfänger-Themen 7
A Methoden Variablen in paint methode Java Basics - Anfänger-Themen 4
M paint-Methode funzt nicht Java Basics - Anfänger-Themen 11
D OOP paint() Methode aus Unterklasse anstoßen Java Basics - Anfänger-Themen 3
K Scrollbar - Bild - paint-Methode - zoom Java Basics - Anfänger-Themen 10
S Bild aus paint() Methode auslagern Java Basics - Anfänger-Themen 14
T Etwas an paint()-Methode übergeben? Java Basics - Anfänger-Themen 6
TheKing Paint-Methode aufrufen Java Basics - Anfänger-Themen 14
N paint methode statt Event-Handling-Methode Java Basics - Anfänger-Themen 3
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
S Frage zur paint-Methode Java Basics - Anfänger-Themen 3
B Applet: Event-Handling-Methode in start- bzw. paint-Methode Java Basics - Anfänger-Themen 7
G Nichtstatische Objekte in der paint()-Methode Java Basics - Anfänger-Themen 16
P paint Methode Java Basics - Anfänger-Themen 3
F Applets und die paint-Methode Java Basics - Anfänger-Themen 3
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
V paint()-methode manuell aufrufen? kein autostart erwuenscht Java Basics - Anfänger-Themen 3
T paint() wieder aus einder anderen methode aufrufen funzt nid Java Basics - Anfänger-Themen 2
G Paint Methode löscht alles Java Basics - Anfänger-Themen 4
G Klassen und paint methode Java Basics - Anfänger-Themen 2
X Malen außerhalb der paint() Methode Java Basics - Anfänger-Themen 4
G Zeichnen ausserhalb der paint Methode Java Basics - Anfänger-Themen 4
V Problem mit der Anzeige einer paint-Methode in einem Panel Java Basics - Anfänger-Themen 2
C Ausgaben mit der Paint-Methode Java Basics - Anfänger-Themen 5
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
S Erste Schritte drawOval Problem in Paint Anwendung Java Basics - Anfänger-Themen 1
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
L Paint() wird scheinbar nicht richtig ausgeführt Java Basics - Anfänger-Themen 8
N aus Container components paint Java Basics - Anfänger-Themen 2
J paint() vs repaint() Java Basics - Anfänger-Themen 3
A Problem mit paint() Java Basics - Anfänger-Themen 2
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
T paint() wird nicht aufgerufen Java Basics - Anfänger-Themen 2
K paint() mit einfügen Java Basics - Anfänger-Themen 14
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J Zweimal im gleichen Paint-Fenster malen Java Basics - Anfänger-Themen 8
V paint funktioniert nicht Java Basics - Anfänger-Themen 14
O Paint Programm mit Fehler Java Basics - Anfänger-Themen 2
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
S Datentypen Paint Programm Java Basics - Anfänger-Themen 7
L Paint zeichnet nicht gespeicherte Objekte Java Basics - Anfänger-Themen 3
A paint() - warum nicht aufrufen? Java Basics - Anfänger-Themen 3
S super.paint() Java Basics - Anfänger-Themen 4
M Paint und JColorChooser Java Basics - Anfänger-Themen 12
G hintergrund wird nicht gezeichnet bei paint() Java Basics - Anfänger-Themen 3
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
K JPanel, JFrame, paint() und wo ist mein Viereck ? Java Basics - Anfänger-Themen 19
F Frage zu JPanel und Paint Java Basics - Anfänger-Themen 5
M Problem mit paint() und Container. Java Basics - Anfänger-Themen 8
B Paint(Component) und externe Objekte Java Basics - Anfänger-Themen 6
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G frage zu paint Java Basics - Anfänger-Themen 3
T Mehrere paint Methoden in unterschiedlichen Klassen Java Basics - Anfänger-Themen 7
G Hilfe in paint() ; zeichnen Java Basics - Anfänger-Themen 15
C Einfaches Paint-Programm Java Basics - Anfänger-Themen 9
T .paint() aufrufen Java Basics - Anfänger-Themen 23
S Paint Teilweise Zeitverzögert Java Basics - Anfänger-Themen 6
R paint problem Java Basics - Anfänger-Themen 6
G mit paint() ins JPanel malen. Java Basics - Anfänger-Themen 6
M Auf Panels oder Labels malen? (paint) Java Basics - Anfänger-Themen 9
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
B Problem mit Einfügen von Choice (in ein Applet) aus Paint Java Basics - Anfänger-Themen 13
7 In Paint keine Schleife? Java Basics - Anfänger-Themen 13
G Paint auf Panel Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5
A Variablenübergabe in die Paint-Funktion Java Basics - Anfänger-Themen 4
D Zeichnen mit Paint zerstört ganzes Fenster Java Basics - Anfänger-Themen 5
T paint() ohne konstruktor aufzurufen? Java Basics - Anfänger-Themen 5
P paint() Java Basics - Anfänger-Themen 6
U paint Java Basics - Anfänger-Themen 8
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
Dilandau paint(Graphics g) { unbekannt in try{} / catch{} }? Java Basics - Anfänger-Themen 5
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben