Swing paint() von JPanel wird nicht aufgerufen

Hatschi

Aktives Mitglied
Folgendes Problem: Die paint(java.awt.Graphics g)-Methode von der inneren Klasse Grid wird nicht aufgerufen. Warum?
Wenn ich die Klasse statt von JPanel von Canvas erben lassen, dann geht es komischer weise...

Java:
public class Field extends toolkit.gui.DBPlotter implements java.awt.event.MouseListener, java.awt.event.ActionListener {
	private final Dimension SCREEN_SIZE = new Dimension(400, 400);
	
	private Color background;
	private JPopupMenu popupMenu;
	private Grid grid;
	private int size;
	private boolean isGrid, gridPossible;
	
	
	public Field(int size, Color background) {
		this.size = size;
		this.background = background;
		
		init();
	}

...

	private void addGrid() {
		int step = SCREEN_SIZE.width / size;
		grid = new Grid(size, step);
		grid.setSize(SCREEN_SIZE);
		add(grid);
	}

...

	private class Grid extends javax.swing.JPanel {
		private int size, step;
		
		
		public Grid(int size, int step) {
			this.size = size;
			this.step = step;
		}
		
		
		@Override
		public void paint(java.awt.Graphics g) {
			g.setColor(Color.BLACK);
			for(int i=1; i<size; i++) {
				g.fillRect(i*step-1, 0, 2, step*size);
				g.fillRect(0, i*step-1, step*size, 2);
			}
		}
	}
}
 

diggaa1984

Top Contributor
überschreib mal paintComponent statt paint .. vielleicht wirkt das schon wunder :) .. bin mir aber net ganz sicher, ist aber der bevorzugte weg
 

eRaaaa

Top Contributor
Mach doch am Besten mal ein kurzes Beispiel welches man ausführen kann!
So kann man doch jetzt nur raten...wird die Methode addGrid() überhaupt aufgerufen? Ist der Frame sichtbar indem das Panel "hinzugefügt" wird? Woher weisst du dass paint/paintCOmponent nicht aufgerufen wird? Was ist step? SIZE ? usw....
 

Hatschi

Aktives Mitglied
Ein extra Test ist eigentlich überflüssig. Lass ich Grid von java.awt.Canvas erben funktioniert alles (nur will ich nicht awt und swing vermischen). Dennoch:
Java:
public class Test extends javax.swing.JFrame {
	public static void main(String[] args) {
		new Test().setVisible(true);
	}
	
	
	public Test() {
		setLayout(null);
		Grid grid = new Grid();
		add(grid);
	}
	
	
	private class Grid extends javax.swing.JPanel {
		public void paint(java.awt.Graphics g) {
			System.out.println("paint");
		}
		
		public void paintComponent(java.awt.Graphics g) {
			System.out.println("paintComponent");
		}
	}
}
selbes Problem, nur das hier auch das Canvas nicht geht...

Ich poste einfach mal den kompletten Code... (die Variabeln sollten ja eigentlich nichts damit zu tun haben, oder doch???)
Java:
package predator.mainWnd;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;


public class Field extends toolkit.gui.DBPlotter implements java.awt.event.MouseListener, java.awt.event.ActionListener {
	private final Dimension SCREEN_SIZE = new Dimension(400, 400);
	
	private Color background;
	private JPopupMenu popupMenu;
	private Grid grid;
	private int size;
	private boolean isGrid, gridPossible;
	
	
	public Field(int size, Color background) {
		this.size = size;
		this.background = background;
		
		init();
	}
	
	
	private void init() {
		setLayout(null);
		
		if(size<50) {
			isGrid = true;
			addGrid();
		}
		else if(size==50) {
			isGrid = false;
			gridPossible = true;
		}
		else {
			isGrid = false;
			gridPossible = false;
		}
		
		addPopupMenu();
	}
	
	
	private void addGrid() {
		int step = SCREEN_SIZE.width / size;
		grid = new Grid(size, step);
		grid.setSize(SCREEN_SIZE);
		add(grid);
	}
	
	
	private void removeGrid() {
		isGrid = false;
		remove(grid);
	}
	
	
	private void addPopupMenu() {
		popupMenu = new JPopupMenu();
		JMenuItem item;
		
		item = new JMenuItem("Vollbild");
		item.setActionCommand("fullScreen");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.ALT_MASK));
		item.addActionListener(this);
		popupMenu.add(item);
		
		item = new JMenuItem("Raster " + (isGrid ? "verbergen" : "anzeigen"));
		if(!gridPossible) item.setEnabled(false);
		item.setActionCommand("grid");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK));
		item.addActionListener(this);
		popupMenu.add(item);
				
		addMouseListener(this);
		setComponentPopupMenu(popupMenu);
	}
	
	
	private void show(MouseEvent e) {
		if(e.isPopupTrigger()) popupMenu.show(e.getComponent(), e.getX(), e.getY());
	}
	
	
	@Override
	public void paint(java.awt.Graphics g) {
		g.setColor(background);
		g.fillRect(0, 0, getWidth(), getHeight());
	}
	
	
	@Override
	public Dimension getPreferredSize() {
		return SCREEN_SIZE;
	}
	

	@Override
	public void mouseClicked(MouseEvent e) {}


	@Override
	public void mouseEntered(MouseEvent e) {}


	@Override
	public void mouseExited(MouseEvent e) {}
	

	@Override
	public void mousePressed(MouseEvent e) {
		show(e);
	}


	@Override
	public void mouseReleased(MouseEvent e) {
		show(e);
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		String ac = e.getActionCommand();
		
		if(ac.equals("grid")) {
			 if(isGrid) removeGrid();
			 else addGrid();
		}
	}
	
	
	private class Grid extends javax.swing.JPanel {
		private int size, step;
		
		
		public Grid(int size, int step) {
			this.size = size;
			this.step = step;
		}
		
		
		@Override
		public void paint(java.awt.Graphics g) {
			g.setColor(Color.BLACK);
			for(int i=1; i<size; i++) {
				g.fillRect(i*step-1, 0, 2, step*size);
				g.fillRect(0, i*step-1, step*size, 2);
			}
		}
	}
}
 

eRaaaa

Top Contributor
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.10 Alles Auslegungssache: die Layoutmanager

Das Argument null bei setLayout() setzt keinen Layoutmanager, und die Komponenten müssen absolut positioniert werden. Zum Setzen der Position und Maße bietet jede Component die Methode setBounds(int x, int y, int width, int height). Ein üblicher Layoutmanager wird mit genau dieser Methode die Größen zuweisen.

Das Setzen vom Null-Layout sollte nicht die Regel sein, da Änderungen an der Zeichensatzgröße hässliche Effekte nach sich ziehen. Eine Oma mit Sehschwierigkeiten, die die Fontgröße auf 40 stellt, sieht dann in einer Schaltfläche vielleicht nur eine halbe, abgeschnittene Zeichenkette.
 

Hatschi

Aktives Mitglied
wenn ich dich richtig verstanden habe, soll ich also "Field" ein Layout zuweisen? Das habe ich mal ausprobiert (auch wenn ich nicht verstehe warum dann paint aufgerufen werden soll...), funktioniert aber trotzdem nicht...
 

eRaaaa

Top Contributor
Also nochmal: Ich beziehe mich jetzt mal auf deinen ersten Code:
Java:
public class Test extends javax.swing.JFrame {
    public static void main(String[] args) {
        new Test().setVisible(true);
    }
    
    
    public Test() {
        setLayout(null);
        Grid grid = new Grid();
        add(grid);
    }
    
    
    private class Grid extends javax.swing.JPanel {
        public void paint(java.awt.Graphics g) {
            System.out.println("paint");
        }
        
        public void paintComponent(java.awt.Graphics g) {
            System.out.println("paintComponent");
        }
    }
}

Durch das null-Layout, hat deine Komponente Grid die Größe 0x0 ! Daher wird auch nicht paintComponent/paint aufgerufen, macht ja eh keinen Sinn!
Du musst also, so wie oben beschrieben deine Komponente selbst positionieren und ihr eine Größe geben(weil du eben keinen Layoutmanager verwendest - wahrscheinlich reicht es auch aus nur setSize aufzurufen, aber positionieren willst du ja meist auch, daher bietet sich setBounds an)
Auf dein Code oben, würde dies also ungefähr folgendes bedeuten:
Java:
	public Test() {
		setLayout(null);
		Grid grid = new Grid();
		grid.setBounds(0, 0, 500, 500);
		add(grid);
		setSize(500, 500);
	}

Dann wird auch paintComponent aufgerufen !

Ansonsten kann es bestimmt auch nicht schaden, sich wirklich mal mit den Layoutmanagern zu beschäftigen !!
 
Zuletzt bearbeitet:

Hatschi

Aktives Mitglied
Java:
public class Test extends javax.swing.JFrame {
	public static void main(String[] args) {
		new Test().setVisible(true);
	}
	
	
	public Test() {
		setLayout(null);
		setSize(500, 500);
		
		Grid grid = new Grid();
		grid.setBounds(0, 0, 500, 500);
						
		Grid2 grid2 = new Grid2();
		grid2.setBounds(0, 0, 500, 500);
				
		grid.add(grid2);
		add(grid);
		
	}
	
	
	private class Grid extends javax.swing.JPanel {
		public void paint(java.awt.Graphics g) {
			System.out.println("0::paint");
		}
		
		public void paintComponent(java.awt.Graphics g) {
			System.out.println("0::paintComponent");
		}
	}
	
	
	private class Grid2 extends javax.swing.JPanel {
		public void paint(java.awt.Graphics g) {
			System.out.println("1::paint");
		}
		
		public void paintComponent(java.awt.Graphics g) {
			System.out.println("1::paintComponent");
		}
	}
}

Ich weiß ich nerve, aber so gehts nicht... auch nicht wenn ich dem n Layout gebe...
 

Sonecc

Gesperrter Benutzer
Schreib mal in deine Paint methoden folgendes mit rein:

Java:
super.paint(g);

Danach werden die anderen Methoden auch aufgerufen, also alle paint und alle paintComponent methoden
 

Hatschi

Aktives Mitglied
es ist zum heulen... jetzt wird zwar die paint aufgerufen, aber man sieht trotzdem kein Bild... ich verzweifele...
Vielleicht bin ich ja auf dem völlig falschen Dampfer. Ich will einfach nur eine Animation laufen lassen und darüber die Möglichkeit haben ein Gitter ein bzw. ausblenden zu können, sollte man das vielleicht anders lösen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
D JPanel und Paint AWT, Swing, JavaFX & SWT 2
J paint(Graphics g) im BorderLayout einem JPanel zuordnen &amp AWT, Swing, JavaFX & SWT 19
T JPanel - paint Methode?, aber wie AWT, Swing, JavaFX & SWT 13
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
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
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
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 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
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
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 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
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
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
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
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
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
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
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
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
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 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
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
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
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
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
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
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
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
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
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
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
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
M Probleme mit paint() aus JFrame AWT, Swing, JavaFX & SWT 2
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
G Frage zum paint Prozess AWT, Swing, JavaFX & SWT 3
B Gui und Zeichnen (paint ? ) AWT, Swing, JavaFX & SWT 4
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben