Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (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 von __Flow__
Geschrieben

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.

Geschrieben

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:

Geschrieben

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

Geschrieben

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.

Geschrieben

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

  • 2 Monate später...
Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...