__Flow__ Geschrieben 5. Januar 2010 Geschrieben 5. Januar 2010 (bearbeitet) Hey ihr furchtlosen Programmierer dort draußen, ich mach schon seit ner Weile java und bin nun mal aus meiner kommandozeilenumgebung herausgekrochen gekommen. Da Swing mir persönlich garnicht sympathisch ist nutze ich das AWT. Jetzt stehe ich vor dem blöden Problem, dass ich mir ein GridLayout für die Panel eingestellt habe ( Ein South und ein North-Panel ) und nun gerne die größe von den viel zu kleinen Listen ändern möchte. anscheinend wird setSize und setBounds hart ignoriert. hier ein stück code, wär super wenn ihr mal draufguckt: public class StartGUI extends Frame { static final int Fheight = 300; static final int Fwidth = 450; private Panel southpanel = new Panel(new GridLayout()); private Panel northpanel = new Panel(); // private Panel westpanel = new Panel(); // private Panel eastpanel = new Panel(); private Label labelText = new Label("Listen Yeah!"); private List tierListe = new List(); //<<<---DIESE private List hundeListe = new List(); //<<<---UND DIESE private MenuBar mbar; // Hund hund = new Hund(); // Katze katze = new Katze(); ArrayList<Tier> liste = new ArrayList<Tier>(); ListFiller filler = new ListFiller(tierListe , liste); public StartGUI() { super("my first gui"); setLayout(new BorderLayout()); // tierListe.setBounds(1, 1, 100, 100); initializeMenus(); initializeButtons(); initializeOthers(); tierListe.setSize(300, 300); //<<<---setSize erledigt? pack(); setSize(Fwidth, Fheight); setVisible(true); } private void initializeButtons() { Button buttonKatze = new Button("Katze zur ArrayList"); Button buttonKatzeToList= new Button("To LIST"); Button buttonHund = new Button("Hund zur ArrayList"); Button buttonHundToList= new Button("To LIST"); southpanel.add(buttonKatze); southpanel.add(buttonKatzeToList); southpanel.add(buttonHund); southpanel.add(buttonHundToList); add("South", southpanel); //Events buttonHund.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub liste.add(new Hund()); System.out.println("added"); } }); buttonHundToList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub filler.fill(); tierListe.repaint(); System.out.println("added to AWT-List"); } }); } private void initializeOthers() { northpanel.add(labelText); northpanel.add(tierListe); northpanel.add(hundeListe); add("North", northpanel); } private void initializeMenus() { mbar = new MenuBar(); final Menu filemenu = new Menu("File"); final Menu helpmenu = new Menu("Help"); MenuItem menuFileOpen = new MenuItem("Open"); MenuItem menuFileSave = new MenuItem("Save"); MenuItem menuFileClose = new MenuItem("Close"); MenuItem menuHelpAbout = new MenuItem("About"); MenuItem menuHelpVersion = new MenuItem("Version"); filemenu.add(menuFileOpen); filemenu.add(menuFileSave); filemenu.addSeparator(); filemenu.add(menuFileClose); helpmenu.add(menuHelpAbout); helpmenu.addSeparator(); helpmenu.add(menuHelpVersion); mbar.add(filemenu); mbar.add(helpmenu); setMenuBar(mbar); // Events menuFileOpen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { // TODO Auto-generated method stub filemenu.disable(); } }); menuFileSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { // TODO Auto-generated method stub filemenu.disable(); } }); } public boolean handleEvent(Event evt) { switch (evt.id) { case Event.WINDOW_DESTROY: { System.exit(0); return true; } default: return false; } } } Bearbeitet 5. Januar 2010 von __Flow__ Zitieren
Ulfmann Geschrieben 5. Januar 2010 Geschrieben 5. Januar 2010 Nach meiner Erfahrung machen dir Layout Manager bei sowas generell das Leben schwer. Das BorderLayout teilt dein Fenster ja in 5 Bereiche: North, South, West, East und Center. Es wäre natürlich schön, wenn man dem "North-Bereich" nun per Hand eine Größe zuweisen kann und so die Proportionen nach Belieben festlegen könnte. Aber das geht nicht und das ist auch der Grund, weswegen dort jegliches setSize() ins Leere greift. Ich hab mir bei sowas von Vornherein die Benutzung des null-Layouts angewöhnt (in Deinem Fall sowohl im Hauptframe, als auch im northpanel). Kostet eine Zeile mehr Code, aber Du hast dann alles in der Hand. Dies nur als Alternativvorschlag. Zitieren
__Flow__ Geschrieben 5. Januar 2010 Autor Geschrieben 5. Januar 2010 hey ulfmann, erstmal einen riesiges danke für die schnelle antwort! sowas in der art haben wir uns auch schon gedacht. so wie ich dich verstanden habe, einfach garkein layout übergeben, weder für das frame noch für das panel. das werde ich mal ausprobieren. falls ich das mit dem null-layout missverstanden habe sags mir bitte ;-) ich melde mich wenn es geklappt hat. nochmal danke :hells: Zitieren
Ulfmann Geschrieben 5. Januar 2010 Geschrieben 5. Januar 2010 Dann beachte dabei aber, dass solche Komponenten immer ein Default Layout zugewiesen bekommen, wenn Du es nicht selbst tust. Bei dem Panel wäre es das FlowLayout, das Dich vor das gleiche Problem stellt. Daher wie gesagt die Empfehlung, das Null-Layout zu benutzen. Zitieren
__Flow__ Geschrieben 5. Januar 2010 Autor Geschrieben 5. Januar 2010 Hey! ich hab das mit dem null-layout durchgezogen (danke für den tipp + link ) ich muss jetzt für jedes objekt die bounds setzen, was um einiges mehr code ist als eine zeile. leider wird die resizability eingebüsst und das setzen der bounds ist sehr zeitaufwendig, aber es funktioniert endlich und ich kann alles nach belieben setzen. Dafür danke ulf! wenn jemandem vllt eine möglichkeit einfällt ohne das null-layout und auch ohne die verwendung von swing wärs klasse wenn er das schreibt. mein hauptproblem haben wir ja erstmal gelöst bekommen bis bald und danke für die schnelle hilfe! liebe Grüße, Flow Zitieren
Dragon8 Geschrieben 5. Januar 2010 Geschrieben 5. Januar 2010 Die Lösung wäre einfach, einen LayoutManager zu verwenden der dass macht was du möchtest. Jedoch für jede Komponente eigenhändig die Größe und Position angeben und dann aber noch nen LayoutManager benutzen zu wollen, passt halt leider nicht so ganz zusammen. Wenn man einen LayoutManager verwendet, dass dafür, dass genau dieser sich darum kümmert wie groß genau die Komponenten sein sollen, und an welcher Position genau sie liegen. Das ist auch der Grund warum deine Angaben zur Größe im Zusammenhang mit einem LayoutManager im Sande verlaufe sind, weil der LayoutManager beim Anzeigen der Komponenten einfach deine gesetzten Werte rücksichtslos überschreibt. Dass in deinem Fall die Listen so klein sind, liegt auch einfach nur an deinem verwendetem LayoutManager. Beim Panel kommt nämlich standardmäßig das FlowLayout zum Einsatz, dieses streckt Komponenten aber nicht auf den gesamten verfügbaren Platz. Hättest du zum Beispiel für dein 'northpanel' wirklich das GridLayout verwendet, wären die beiden Listen auch um einiges größer, da diese bei dem LayoutManager dann auf den verfügbaren Platz ausgeweitet werden. Vom null-Layout halte ich dagegen ehrlich gesagt nicht viel. Als ich vor ein paar Jahren zu Java wechselte fand ich gerade die LayoutManager eine tolle Erfindung. Wenn man sich da mal ein wenig mit beschäftigt und sich klar macht, wie welche LayoutManager arbeiten, bekommt man mit denen auch eigentlich alles hin. Und wenn man es sich noch etwas leichter machen will, dann schaut man mal im Internet nach weiteren LayoutManager, da gibt es noch nen paar die es einem um einiges einfacher machen wie die integrieten Manager. Zitieren
Kaeyu Geschrieben 5. Januar 2010 Geschrieben 5. Januar 2010 Da kann ich mich meinen Vorrednern nur anschließen. Ich meine aber mit setPreferredSize sollte es auch funktionieren - zumindest beim FlowLayout. Zitieren
__Flow__ Geschrieben 5. Januar 2010 Autor Geschrieben 5. Januar 2010 Das ist sehr gut zu wissen, danke! Ich werd mich das nächste mal auf jeden fall durch den Layoutmanager quälen und dann klappts bestimmt auch mit dem nachbarn ;-) Danke, dass du trotz erfolgter hilfestellung zeit dafür investiert hast. Freut mich sehr, bis bald bestimmt! Flo Zitieren
meises Geschrieben 23. März 2010 Geschrieben 23. März 2010 Hallo Du musst nicht jedesmal für jede Komponente ein Null-LayoutManager wählen, es genügt, wenn du ihn nur für die Liste (welche sich mit setPreferredSize)komischerweise nicht verbreitern lässt, einen Null Layout-Manager wählst. Mein Code: Panel zwischencontainer = new Panel(); //Mein Zwischencontainer zwischencontainer.setLayout(null); //Hier geb ich Null-Layoutmanager // Grösse für Zwischen-Container zwischencontainer.setPreferredSize(new Dimension(185, 60)); //Liste erstellen List list = new List(); //Was hinzufügen list.add("CHF"); list.add("EUR"); list.add("USD"); list.add("GBP"); //Jetzt kann ich meine Grösse wählen :bimei list.setSize(185, 60); //am Schluss nicht vergessen beide Komponenten zu adden. nullcontainer.add(list); currency.add(nullcontainer); Greez meises Zitieren
speedi Geschrieben 24. März 2010 Geschrieben 24. März 2010 setPrefferedSize(...) setMinimumSize(...) setMaximumSize(...) Mit diesen Methoden kannst du deiner GUI-Componente größen übergeben die der layout-Manager (in deinem Fall BorderLayout) abfragt und nach Möglichkeit beachtet. Eine andere mehr oder weniger schöne möglichkeit für dynamische GUIs ist null-Layout in Combination mit einem ComponentListener auf dem Container oder einer überschriebenen setBounds()-Methode des Containers, wo du dann die größenberechnungen selbst durchführen kannst. 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.