hyperion Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Hallo, so jetzt habe ich endlich mal (versucht) eine eigene GUI zu erstellen und habe gleich einige Fehler gemacht. Der Code ist noch nicht sonderlich groß da gleich zu beginn Fehler auftraten die ich gleich geklärt haben will. Verwendet habe ich diese Dokumentation: Overview (Java Platform SE 6) Der Code ist hier(Fehler sind rot markiert): package my.Funktionomat; /* author Max */ import javax.swing.*; import java.awt.*; public class GUIBuilder extends JFrame { //Deklerationen JFrame Fenster; JMenuBar MenuBar; JMenu MenuDatei, MenuBearbeiten, MenuExtras; //Konstruktor GUIBuilder() { //Fenster Fenster = new JFrame(); Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Fenster.setSize(800,600); [COLOR="Red"]Fenster.getContentPane().setBackground(Color.white);[/COLOR] Fenster.setLocation(100,100); //MenuBar MenuBar = new JMenuBar(); //MenuBar dem Fenster hinzufügen Fenster.getContentPane().add(MenuBar); //Menus MenuDatei = new JMenu("Datei", true); MenuBearbeiten = new JMenu("Bearbeiten", true); MenuExtras = new JMenu("Extras",true); //Menus der MenuBar hinzufügen MenuBar.add(MenuDatei); MenuBar.add(MenuBearbeiten); MenuBar.add(MenuExtras); [COLOR="Red"]MenuBar.setLocation(0,0);[/COLOR] //sichtbar machen Fenster.setVisible(true); } //Starter public static void main(String[] args) { GUIBuilder Frame = new GUIBuilder(); } } Mir ist nicht ganz klar warum der Hintergrund immernoch Grau ist. Die Anweisung: "Fenster.getContentPane().setBackground(Color.white);" sollte doch eigentlich den Hintergrund weis einfärben. Außerdem ist mir nicht klar warum meine MenuBar Mitte-Links erscheint. Die Anweisung: "MenuBar.setLocation(0,0);" sollte doch eigentlich die MenuBar relativ zu Fenster auf (0,0) platziert werden. Mir ist klar, dass .setLocation keine Methode von MenuBar ist, aber da ich ja extends JFrame geschrieben habe wird die Methode doch von JFrame geerbt oder? Super fände ich auch, wenn ihr euch den Code allgemein anschaut und mir Tipps zu Programmierstil, Einrückungen, etc gebt. Habe erst Programmieren angefangen und bin über jeden Rat dankbar. mfg hyperion Zitieren
TDM Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Warum definierst du ein JFrame in einem JFrame? :beagolisc Dadurch kommt es zum Unterschied zwischen this und Fenster. Zitieren
Dragon8 Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Also wenn man ein wenig mehr von der GUI Programmierung mit Swing unter Java versteht, sind die Fehler leicht zu erklären, so, könnte es aber ein wenig schwierig werden, aber ich versuche es einfach mal. Also dein, deiner meinung nach, 1. Fehler ist eigentlich gar keiner. Die Anweisung funktioniert so, wie sie es tun soll. Der Hintergrund deines Fensters wird weiß eingefärbt. Warum du das nicht siehst, hängt direkt mit deinem zweiten Problem zusammen. In Swing werden standardmäßig die Komponenten in einem Container mit Hilfe eines Layout-Managers angeordnet. Dieser ist dafür zuständig die passenden Position und Größen automatisch festzulegen. Das hat unter anderem den Vorteil, dass wenn dein Fenster in der Größe verändert wird, die Größe und Position der Komponente automatisch so angepasst wird, dass es noch immer passt. Das bewirkt aber, dass die Methoden setLocation() und setSize() auf den Komponenten keine Wirkung zeigen, da die Werte beim Aufrufen des Fensters überschrieben werden. Layout-Manager gibt es viele verschiedene, alle arbeiten nach anderen Methoden wie man diesen Managern beschreibt, wie die Komponenten ungefähr angeordnet werden sollen. Ein JFrame besitzt standardmäßig das BorderLayout. Dieses BorderLayout hat genau 5 Bereiche in denen jeweils eine Komponente, oder ein weiterer Container mit weiteren Komponenten, angeordnert werden kann. Das jeweilige Objekt nimmt immer die gesamte Größe seines Bereiches ein. Diese 5 Bereiche sind NORTH, EAST, SOUTH, WEST und CENTER. Hinter der Verlinkung zur Java Doku findest du auch eine Darstellung dazu. Um dem Layout-Manager mitzuteilen, in welchen der Bereich deine Komponenten positioniert werden soll, musst du eine der 5 Konstanten des BorderLayouts in der add()-Methode des JFrames mitgeben. Wenn nichts angegeben wird, wird die Komponente automatisch in den CENTER-Bereich positioniert. Dieser Bereich nimmt immer den gesamten freien Platz ein, dh, da du in allen anderen Bereichen keine Komponenten hast, wird auch der gesamte Platz deines Fensters für deine Menübar benutzt. Und dies ist auch der Grund, warum du keinen weißen Hintergrund siehst, die Menübar verdeckt ihn einfach Um das Problem zu lösen änder die Zeile, in der du die Menübar deinem Frame hinzufügst folgendermaßen um: Fenster.getContentPane().add(MenuBar, BorderLayout.NORTH); Ich würde dir in dem Zuge auch empfehlen dir das folgende Tutorial von Sun über Layout-Manager durchzulesen: Lesson: Laying Out Components Within a Container (The Javaâ„¢ Tutorials > Creating a GUI with JFC/Swing) Oder, da du ja gerade erst mit Swing anfängst, gleich das gesamte Tutorial über Swing: Trail: Creating a GUI with JFC/Swing (The Javaâ„¢ Tutorials) Ich hoffe habe das für dich einigermaßen verständlich erklärt. Zitieren
Johnny90 Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 eine JMenuBar fügt man einem JFrame folgendermaßen hinzu: JFrame fenster = new JFrame(); JMenuBar menuBar = new JMenuBar(); fenster.setJMenuBar(menuBar); Johnny Zitieren
hyperion Geschrieben 21. Juli 2008 Autor Geschrieben 21. Juli 2008 Hallo, Warum definierst du ein JFrame in einem JFrame? Dadurch kommt es zum Unterschied zwischen this und Fenster. Hmm ich glaube das verstehe ich nur zur Hälfte. Ich weiß, dass GUIBuilder eine "ist-ein"-Beziehung zu JFrame hat, aber deshalb kann ich doch trotzdem etwas als JFrame deklarieren wenn es ein JFrame ist oder? Und der this greift doch immer auf die Instanzvariablen zu und Fenster ist bei mir doch eine Instanzvariable also ist es doch egal ob ich this oder Fenster schreibe? Das bewirkt aber, dass die Methoden setLocation() und setSize() auf den Komponenten keine Wirkung zeigen, da die Werte beim Aufrufen des Fensters überschrieben werden. Aha und wie kann ich den LayoutManager ausschalten, sodass ich exakte Positionen angeben kann wenn ich das denn wollte? Um das Problem zu lösen änder die Zeile, in der du die Menübar deinem Frame hinzufügst folgendermaßen um: Fenster.getContentPane().add(MenuBar, BorderLayout.NORTH); Funktioniert, aber ehrlich gesagt finde ich in der Doku keine add Methode mit dieser Parameterliste. Bin ich blind oder die Doku veraltet? fenster.setJMenuBar(menuBar); Funktioniert auch. Doch welche ist nun die bessere Variante? Ich würde ja raten die 2. da diese extra für eine MenuBar da ist und die 1. allgemin verwendet werden kann. Danke für die Erklärungen @Dragon8. mfg hyperion Zitieren
Dragon8 Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Ich weiß, dass GUIBuilder eine "ist-ein"-Beziehung zu JFrame hat, aber deshalb kann ich doch trotzdem etwas als JFrame deklarieren wenn es ein JFrame ist oder? Und der this greift doch immer auf die Instanzvariablen zu und Fenster ist bei mir doch eine Instanzvariable also ist es doch egal ob ich this oder Fenster schreibe? Naja ich denke er meinte, dass deine Klasse GUIBuilder umsonst von der Klasse JFrame erbt da du in der Klasse ja nochmal extra nen JFrame erzeugst und diese dann anzeigst. Die Vererbung könntest du also rausnehmen. Aha und wie kann ich den LayoutManager ausschalten, sodass ich exakte Positionen angeben kann wenn ich das denn wollte? JFrame.setLayout(null) Damit ist kein LayoutManager zugewiesen und du musst bei allen Componenten die Größe und Position per Hand eintragen. Funktioniert, aber ehrlich gesagt finde ich in der Doku keine add Methode mit dieser Parameterliste. Bin ich blind oder die Doku veraltet? Diese add()-Methode ist in der Doku in der Klasse Container zu finden, von der JFrame entfernt erbt. ( add(Component, Object) ) Funktioniert auch. Doch welche ist nun die bessere Variante? Ich würde ja raten die 2. da diese extra für eine MenuBar da ist und die 1. allgemin verwendet werden kann. Ich würde auch meinen die 2. Die ist mir aber gerade nicht eingefallen als ich die Erklärung geschrieben hatte, was wohl vor allem daran liegt, dass ich Menüs noch nicht so oft benutzt habe. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.