Swing JFrame nimmt keine anderen Elemente auf

Captain83

Mitglied
Hallo,

ich habe ein Problem mit der Darstellung einer Ampel. Vermutlich sind es Noob-Probleme, ich komme aber einfach nicht weiter. Nach stundenlangem Lesen von sowohl Javainsel und Teia-Lehrbuch als auch dem Stöbern in zig Foren und Tutorials, bin ich nun vollkommen verwirrt. ???:L
Ich versuche eine Ampel darzustellen... Datenbankzugriff, Auswertung, alles funktioniert(getestet mit println()s... Aber die Darstellung haut einfach nicht hin....
Ich habe eine Klasse Ampel... hier funktionert das mit dem Container nicht, kann mir jemand sagen, wieso?

Java:
public class Ampel extends JFrame {
	public enum Ampelzustand {ROT, GRÜN, STÖRUNG};
	Ampelzustand z;
	Container con;	
	
	Ampel() {
		super("Warenkorb - Füllstandsanzeige");
		this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
		con = getContentPane();
		this.con = con;
		this.setSize(1680,1050);
		this.setVisible(true);
		this.setResizable(false);
		con.setBackground(Color.BLACK);
			
	}
	
	public void setZustand(String zustand) {
		if (Ampelzustand.GRÜN.toString().equals(zustand)) {
			System.out.println("GRÜN");
			
			Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.BLACK);
			getContentPane().add(lampeOben);
			//con.add(lampeOben);
			Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.GREEN);
			getContentPane().add(lampeUnten);
			//con.add(lampeUnten);
			
		}
		
		else if (Ampelzustand.ROT.toString().equals(zustand)) {
			System.out.println("ROT");
			
			Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.RED);
			con.add(lampeOben);
			Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.BLACK);
			con.add(lampeUnten);
		}
		
		else {
			System.out.println("Gelb blinkend");
			try {
				
				Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.BLACK);
				con.add(lampeOben);
				Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.YELLOW);
				con.add(lampeUnten);
				
				Thread.sleep(1000);
				
				/*
				Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.YELLOW);
				con.add(lampeOben);
				Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.BLACK);
				con.add(lampeUnten);
				*/
				
			}
			
			catch (Exception e) {
				e.printStackTrace();
			}
		
		}
		
	}
	
}

Java:
public class Ampellicht extends JPanel {
	int x;
	int y;
	int width;
	int height;
	Color color;
		
	Ampellicht(int x, int y, int width, int height, Color color) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
		this.color = color;
			
	}
	
	protected void paintComponent(Graphics g) {
		super.paintComponents(g);
		
		g.setColor(color);
		g.fillOval(x, y, width, height);
		
	}
	
}

Die Methode paintComponent wird gar nicht aufgerufen soweit ich das analysieren konnte. Wieso, wiederum ka....

Vielen Dank für eure Hilfe im Voraus
 

Fab1

Top Contributor
Hi,

mach hier mal das "s" weg, vielleicht geht es dann.

Java:
 protected void paintComponent(Graphics g) {
        super.paintComponents(g); // hier super.paintComponent(g); glaub daran liegt es
        
        g.setColor(color);
        g.fillOval(x, y, width, height);
        
    }
 

Captain83

Mitglied
Danke Fab1, das war auf jeden Fall schon mal ein Fehler...

Bleibt immer noch das Problem mit dem Container...
Ich habe leider keine Ahnung, was daran nicht stimmt....
 

Fab1

Top Contributor
Also ich habe noch nie mit so einem Container wie du hier gearbeitet.

Aber ich würde es so machen. So wie du die Ampel Objekte erzeugst brauchst du auf alle Fälle mal ein Null-Layout beim JFrame. Da du ja beim erzeugen die X und Y Koords. angegeben hast.

also einfach setLayout(null); in den Konstruktor vom JFrame rein.

überall wo du das con verwendest kannst ja mal auskommentieren.

anschließend

Java:
    Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.BLACK);
             add(lampeOben);
            
            Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.GREEN);
            add(lampeUnten);

Nach meinem glauben sollte es jetzt schon funktionieren, kann es nur gerade nicht testen. Bei den else-if und dem else natürlich auch entsprechend ändern.

Hoffe es funzt, ansonsten schau ich daheim nochmal drüber.
 

xehpuk

Top Contributor
Ein JFrame hat standardmäßig das BorderLayout. Da fügt man nicht einfach so Komponenten hinzu.
Du solltest dich allgemein mit LayoutManagers beschäftigen. Dazu findet sich genug im Netz.
Passend wäre in deinem Fall wohl BoxLayout oder GridLayout.

Code:
g.fillOval(x, y, width, height);
wird relativ zur Komponente zeichnen. Du solltest da für x und y eher 0 haben.
 

Captain83

Mitglied
Ich wollte eigentlich nur zum Testen jetzt mal die Grafiken einfügen... Später soll das ganze natürlich in einen Layoutmanager, es kommen ja auch noch einige Dinge dazu....
Es sind 2 Lampen, eine oben, eine unten.... desshalb auch die Koords 0,0 bzw. 0,450...
Es sollte doch zum Testen eigentlich wenigstens die 2 Lampen anzeigen, oder?

Ich habe es nach deinem Vorschlag abgeändert Fab1. Beim Debuggen springt er aber nie in die paintComponent()-Methode hinein, das wird wohl das Problem sein. Aber ich weiß nicht wieso... Soweit ich weiß, muss ich die Methode doch nicht explizit aufrufen , oder?

Java:
public class Ampel extends JFrame {
	public enum Ampelzustand {ROT, GRÜN, STÖRUNG};
	Ampelzustand z;
		
	Ampel() {
		super("Warenkorb - Füllstandsanzeige");
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
		setSize(1680,1050);
		setVisible(true);
		setResizable(false);
		setLayout(null);
		getContentPane().setBackground(Color.BLACK);
			
	}
	
	public void setZustand(String zustand) {
		if (Ampelzustand.GRÜN.toString().equals(zustand)) {
			System.out.println("GRÜN");
			
			Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.BLACK);
			add(lampeOben);
			Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.GREEN);
			add(lampeUnten);
			
		}
		
		else if (Ampelzustand.ROT.toString().equals(zustand)) {
			System.out.println("ROT");
			
			Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.RED);
			add(lampeOben);
			Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.BLACK);
			add(lampeUnten);
		}
		
		else {
			System.out.println("Gelb blinkend");
			try {
				
				Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.BLACK);
				add(lampeOben);
				Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.YELLOW);
				add(lampeUnten);
				
				Thread.sleep(1000);
				
				/*
				Ampellicht lampeOben = new Ampellicht(0, 0, 400, 400, Color.YELLOW);
				con.add(lampeOben);
				Ampellicht lampeUnten = new Ampellicht(0, 450, 400, 400, Color.BLACK);
				con.add(lampeUnten);
				*/
				
			}
			
			catch (Exception e) {
				e.printStackTrace();
			}
		
		}
		
	}
	
}
 

xehpuk

Top Contributor
Code:
setLayout(null)
bitte schnell wieder vergessen.

Es sind 2 Lampen, eine oben, eine unten.... desshalb auch die Koords 0,0 bzw. 0,450...
Es sollte doch zum Testen eigentlich wenigstens die 2 Lampen anzeigen, oder?
Wieso sollte er das machen? Die "Koordinaten" sind lediglich Instanzvariablen in deiner Ampellicht-Klasse. Aufs Layout haben sie also keinen Einfluss.

Lektüre: Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing)
 
Zuletzt bearbeitet:

Captain83

Mitglied
Hm was das Layout angeht, hast du wohl Recht... Ich guck mir trotzdem mal deinen Link an. :)

Aber es müsste doch wenigstens irgendwas, vielleicht sich was überlagerndes oder sowas, erzeugt werden. Bei mir tut sich leider gar nix..... Es wird ja nicht mal die paintComponent()-Methode aufgerufen...
 

bERt0r

Top Contributor
Am besten machst du das so: Du hast 2 (oder besser wohl 3) Ampellichter. Die fügst du einmal im Konstruktor des Frames ein, merkst dir die Instanzen aber in einer Klassenvariable.
Verpass deiner Ampellicht Klasse eine setColor Methode.
Ändert sich jetzt dein Ampelzustand, erzeugst du keine neuen Ampellichter, sonder änderst einfach die Farbe deiner bestehenden.
Zum Testen würde ich dir erstmal einfach ein FlowLayout empfehlen.

edit: Du solltest ausserdem noch die PreferredSize deiner Ampellichter verändern. Standardmäßig sind die JPanels 2x2 Pixel groß.
 
Zuletzt bearbeitet:

Captain83

Mitglied
Danke bERt0r, ich werd das gleich mal ausprobieren...
Trotzdem werd ich immer noch ned ganz schlau daraus, wieso wird die paintComponent()-Methode nie aufgerufen?
 

L-ectron-X

Gesperrter Benutzer
Die wird schon aufgerufen. Nur macht das nicht der Programmierer direkt. Sondern durch anfordern eines Neuzeichnens. Aber das ist situationsabhängig.
Java selbst ruft ansonsten die Methode auf, wenn es nötig wird.
 

Captain83

Mitglied
Guten Morgen allerseits,

zuerst noch einmal Dankeschön für eure Antworten. Ich rieche förmlich, dass die Lösung des Problems naht , naja hoffen wir es zumindest mal :lol:
Hm, was ist denn dann an meiner Ampellicht-Klasse so falsch, dass die paintComponent()-Methode nicht aufgerufen wird`?

Ist ein JPanel für ein Ampellicht überhaupt der richtige Container oder sollte ich lieber Canvas nehmen?
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Java:
int x;
    int y;
    int width;
    int height;
Du solltest dir andere Variablennamen suchen, diese gibts schon in JComponent bzw. JPanel. Ausserdem solltest du die Größe deines Panels mit setSize und/oder setPreferredSize auf deine Größe anpassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
Paty JFrame anfänger bräuchte hilfestellung AWT, Swing, JavaFX & SWT 7
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
Mausposition relativ zu JFrame bekommen AWT, Swing, JavaFX & SWT 6
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
N CPU Belastung bei offenem JFrame auf fast 100% AWT, Swing, JavaFX & SWT 15
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
E JFrame resizing AWT, Swing, JavaFX & SWT 2
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Tabelle in JFrame einfügen AWT, Swing, JavaFX & SWT 1
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Swing Design des oberen Balkens in JFrame AWT, Swing, JavaFX & SWT 2
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
K JFrame bei JUnit Tests AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
R Swing JPanels auf JFrame auf verfügbaren Platz aufblasen AWT, Swing, JavaFX & SWT 4
JR2205 Swing JxMaps Einbindung Netbeans JFrame AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
Ghostman1711 JFrame closing AWT, Swing, JavaFX & SWT 3
R Engineklasse mit JFrame AWT, Swing, JavaFX & SWT 4
M Default-WindowListener JFrame entfernen (Stichwort: iconified) AWT, Swing, JavaFX & SWT 4
ms_cikar Jframe zurück zu frame1 AWT, Swing, JavaFX & SWT 14
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
R JFrame schließen AWT, Swing, JavaFX & SWT 9
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
I JFrame an Bildschirm anpassen AWT, Swing, JavaFX & SWT 1
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
P JFrame schrumpft bei Doppelklick auf die Titelleiste AWT, Swing, JavaFX & SWT 0
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
D JFrame mindestgröße erzwingen AWT, Swing, JavaFX & SWT 2
H Swing JFrame mit JFXPanel NPE bei dispose() AWT, Swing, JavaFX & SWT 6
C Swing Borderlayout im JFrame AWT, Swing, JavaFX & SWT 4
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
G Swing JFrame öffnen bei Pidgin Benachrichtigung AWT, Swing, JavaFX & SWT 5
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
G Resize JFrame AWT, Swing, JavaFX & SWT 8
J Teiltransparenter JFrame mit Blur-Effekt AWT, Swing, JavaFX & SWT 2
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
K SplashScreen neben JFrame behalten AWT, Swing, JavaFX & SWT 10
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
T Applet Applet in JFrame einbinden AWT, Swing, JavaFX & SWT 8
V JFrame wird nicht richtig angezeigt! AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
Y Kann man Buttons in einem JFrame rund machen ? AWT, Swing, JavaFX & SWT 2
W Swing Farbige JPanels auf JFrame werden nicht gezeigt. Was mach ich falsch? AWT, Swing, JavaFX & SWT 7
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
O Swing JFrame Anzeigeproblem AWT, Swing, JavaFX & SWT 2
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16

Ähnliche Java Themen

Neue Themen


Oben