LayoutManager Problem mit setLayout(LayoutManager)

  • Themenstarter Themenstarter Radeon
  • Beginndatum Beginndatum
R

Radeon

Gast
Wie im Titel zu lesen habe ich meine Probleme mit dem LayoutManager. Was früher anstandslos funktionierte bringt mich jetzt um den letzten Nerv.
Vorweg: Ich nutze Eclipse.
Ich möchte für meine Präsentationsprüfung nächste Woche mitunter das FlowLayout, BorderLayout und GridLayout vorstellen und dazu ansichtlich drei GUIs programmieren anhand deren man den Unterschied ziemlich schnell und gut erkennt. Alles kein großes Problem der Code für alle drei Klassen steht im Prinzip und MÜSSTE so funktionieren - selbst direkt kopiertes aus "Java ist auch eine Insel" wird nicht gefressen.
Java:
package präsentationsprüfung;

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


public class BorderLayout extends JFrame{

	private static final long serialVersionUID = 1L;

		public static void main(String[] args)
	{
		JFrame f = new JFrame();
		f.setTitle("BorderLayout");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLayout(new BorderLayout());
		f.setSize(400,400);
		f.setLocationRelativeTo(null);
		
		JButton b1 = new JButton("1");
		f.add("North", b1);
		JButton b2 = new JButton("2");
		f.add("East", b2);
		JButton b3 = new JButton("3");
		f.add("South", b3);
		JButton b4 = new JButton("4");
		f.add("West", b4);
		JButton b5 = new JButton("5");
		f.add("Center", b5);
		
		f.setVisible(true);
	}

}
Und zwar meckert Eclipse bei setLayout rum mit folgendener Fehlermeldung:
The method setLayout(LayoutManager) in the type JFrame is not applicable for the arguments (BorderLayout)
Während im Package Explorer neben meinem "Präsentationsprüfung"-Projekt auch noch mein altes "Schach"-Projekt ist funktionierte die GUI vom Schachprogramm mitsamt eines BorderLayouts bis zuletzt ohne Probleme, bis nun auch dort die Fehlermeldung für die setLayout() Methode auftaucht.
Ich bin vollkommen überfragt was Eclipse da für Fakten macht und hoffe einer von euch hat eine passende Lösung!
Herzlichen Dank schonmal!
 
Also, eigentlich ist die Methode
Code:
f.setLayout(new BorderLayout());
auch richtig so, aber mir sind noch zwei Sachen aufgefallen:
Es ist vielleicht nicht wirklich gut, wenn du deine Klasse auch noch BorderLayout nennst... (einfach mal umbenennen)
Und die Komponenten solltest du so dem BorderLayout zuweisen:
Java:
add(Komponente, BorderLayout.NORTH);
und nicht so:
Java:
f.add("North", b1);
 
Also, eigentlich ist die Methode
Code:
f.setLayout(new BorderLayout());
auch richtig so, aber mir sind noch zwei Sachen aufgefallen:
Es ist vielleicht nicht wirklich gut, wenn du deine Klasse auch noch BorderLayout nennst... (einfach mal umbenennen)
Und die Komponenten solltest du so dem BorderLayout zuweisen:
Java:
add(Komponente, BorderLayout.NORTH);
und nicht so:
Java:
f.add("North", b1);

Danke schonmal für deine rasche Antwort!🙂
Okay, habe den add() Aufruf angepasst, hat sich damit allerdings nicht gebessert. In der damaligen SchachbrettGUI Klasse hat es nach vorangegangen Muster bis dato auch so funktioniert.
Auch das Umbenennen brachte keinerlei Änderung, auch hier der Wink in richtung der SchachbrettGUI in der die Klasse ja keinen Layoutnamen hatte.

Also ich persönlich denke ja eher das es an Eclipse liegt und weniger am Code.
Jetzt ist nur noch die Frage wie sich die Geschichte beheben lässt.
 
Hast du das jetzt umbenannt:
Java:
public class BorderLayout extends JFrame
Also die Klasse nicht BorderLayout nennen, weil es sonst natürlich Probleme mit der anderen Klasse BorderLAyout (dem LayoutManager) gibt, den du benutzen möchtest.
Wenn du dann die add-Methoden auch noch angepasst hast, müsste es eigentlich klappen. Dürfte auch nicht an Eclipse liegen. Vielleicht postest du ja nochmal deinen neuen Code und evtl. Fehlermeldungen, damit man schauen kann, woran es jetzt liegt.
 
Oder [c]f.setLayout(new java.awt.BorderLayout());[/c] 😀

Btw: Zu dem
Und die Komponenten solltest du so dem BorderLayout zuweisen .. und nicht so ...
Das ist eig. egal (von der Funktionalität her!) Es geht beides, gibt sogar noch andere Varianten (z.B. deine nur umgedreht die Parameter)

Allerdings ist das so mit den direkten Strings fehleranfälliger, laufen sollte das aber dennoch!

/edit: also dein Code läuft bei mir wenn ich die Klasse umbenenne oder eben den Packagenamen vorsetze!
 
Zuletzt bearbeitet:
Das ist eig. egal (von der Funktionalität her!) Es geht beides, gibt sogar noch andere Varianten (z.B. deine nur umgedreht die Parameter)

Allerdings ist das so mit den direkten Strings fehleranfälliger, laufen sollte das aber dennoch!
OK, das mit den umgedrehten Parametern wusste ich, aber das auch der String "North" funktioniert, war mir neu. Vergess ich aber lieber schnell wieder...
Ich würde aber trotzdem dazu raten, der Klasse einen anderen Namen zu geben.
 
Fehlalarm!😉
Also es lag wohl an der BorderLayout Klasse am Klassennamen. Hatte den Vorhin zwar mit Eclipse umnennen lassen, dabei hat es mir aber auch die setLayout() Methode zu setLayout(newBorderLayoutDemo()); zerschossen da ich die Klasse in BorderLayoutDemo umbenannt habe und Eclipse eigenständig alles ersetzt hat.

Trotzdem verstehe ich jetzt nicht weshalb die SchachbrettGUI Klasse weiterhin den selben Fehler anzeigt, die hatte schließlich nie eine Klassen/LayoutManater-Namen-Dopplung.

Tante Edith: Ich glaube ich kenne des Rätsels Lösung!
Wie ich gerade auch in der SchachbrettGUI Klasse festellen musste wurde auch dort das Layout in BorderLayoutDemo geändert. Somit schlussfolgere ich das mit dem erstellen der BorderLayout Klasse sozusagen der LayoutManager import überschrieben wurde und somit statt auf den LayoutManager auf die von mir erstelle Klasse zugegriffen wurde.

Lange Rede kurzer Sinn:
Niemals die Klasse nach einem LayoutManager (oder Analog anderen Klassenimporten[?]) benennen.

Herzlichen Dank euch beiden für die schnelle Hilfe!🙂
 
Zuletzt bearbeitet von einem Moderator:
Was hier, glaube ich, auch noch nicht zur Sprache kam: es macht keinen Sinn und ist dann auch eine Fehlerquelle, die leicht übersehen wird, dass du in deinem Code von JFrame erbst, dann aber eine weitere Instanz eines JFrames erzeugst und mit dieser dann arbeitest.
Also: bitte immer nur eins von beidem.
 
Was hier glaube ich auch noch nicht zur Sprache kam: es macht keinen Sinn und ist dann auch eine Fehlerquelle, die leicht übersehen wird, ist, dass in deinem Code von JFrame erbst, dann aber eine weitere Instanz eines JFrames erzeugst und mit dieser dann arbeitest.
Also: bitte immer nur eins von beidem.
Tatsache, das ist noch ne Leiche von Copy&Paste gehabe...Dankeschön!🙂
 

Neue Themen


Zurück
Oben