GridBag, Preferred Size und Textarea

Layna

Erfahrenes Mitglied
Ok, ich DACHTE ich hätte meine Oberfläche wie sie soll.. und habe ein NEUES Problem.
Und zwar habe ich auf einer Oberfläche JTextAreas.
Die Definition der Oberfläche siehr folgendermaßen aus:

Code:
Dimension normSize = new Dimension(600,400);

JPanel inputHolder = new JPanel(); //auf diesem Panel werden die Inputs angezeigt
inputHolder.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
inputHolder.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTHWEST;
c.ipadx = 2;
c.ipady = 2;
	
JScrollPane scrollPane = new JScrollPane(inputHolder);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setSize(normSize);
inputHolder.setPreferredSize(normSize);
inputHolder.setSize(normSize);

Alle Elemente (inklusive der TextAreas) lassen sich problemlos anordnen.
Jetzt treffe ich leider auf folgendes Phänomen (was mich ziemlich zur verzweiflung treibt):
Wenn ich in eine TextArea schreibe. wird diese mit jedem Absatz höher... bis zu einer höhe, an der sie alle anderen Elemente überdeckt!
Die ScrollPane wiederrum ignoriert diese Vergrösserung, ich kommt also an die anderen Elemente nicht mehr heran sobald die TextArea zu voll wird.
Mein versuch auf das PreferredSize zu verzichten (oder es auf die scrollPane umzulegen) führte dazu, dass ich zwar an alle elemnte herankam.. allerdings JEDE der TextAreas die Höhe meines Bildschirmes annahm.
Ich hiffe IRGENDJEMAND hat zumindest einen Denkanstoss was ich noch versuchen kann um die TextAreas einzuzäunen. ich BRAUCHE an dieser stelle die möglichkeit einer mehrzeiligen Texteingabe.
 
Tach,
was passiert, wenn Du bei den GridBagConstraints für die JTextArea das fill auf GridBagConstraints.NONE setzt?
 
Leider noch das gleiche.
Die Textarea ist in ein Panel eingeschlossen, welches sich scheinbar kurzerhand über alle anderen Komponenten rüberschiebt.
Alle MaxSize werden ebenfalls kurzerhand ignoriert (sowohl von der TextArea als auch von Panel, auf dem die liegt).
 
Zuletzt bearbeitet:
Was ist dann, wenn die y-Wichtung der darüber/darunter liegenden Komponenten auf > 0.0 gesetzt wird und für die JTextArea auf 0.0?
 
Larayna hat gesagt.:
Noch immer das gleiche...
Alternative Elemente für einen mehrzeiligen Input gibt es nicht, oder?
Doch: die JTextPane und JEditorPane, aber layoutmässig werden sie sich betimmt genauso verhalten.

Übrigens, die Variable c wird gar nicht verwendet, oder ist der Code unvollständig?
 
Hm, ohne mir das anschauen zu können, muss ich an dieser Stelle wohl passen. Wenn es etwas viel Code ist, kannst ja evtl. nicht hier sondern bei http://nopaste.php-q.net/ posten und den Link hier hinterlassen. Dann schaue ich mir das mal an.
 
Das ist nciht der gesamte code.
c wird hinterher zum einfügen der Komponenten verwendet... was bis auf das Grössenproblem funktioniert.
 
Hier einmal die Komplette klasse:

Code:
public void createGUI() {
			int x,y; //zähler für das GridBagLayout
			int x_max = 3; //Maximale anzahl von elementen nebeneinander
			Dimension normSize = new Dimension(600,400);  //Normale grösse des Fensters
			x = -1;
			y = -1;

			//Fenster erstellen
			frame.setTitle("Daten für "+OracleTableName);
			frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
			frame.getContentPane().setLayout(new BorderLayout());

			//Bauen der Oberfläche
			JPanel inputHolder = new JPanel(); //auf diesem Panel werden die Inputs angezeigt
			inputHolder.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
			inputHolder.setLayout(new GridBagLayout());
			GridBagConstraints c = new GridBagConstraints();
			c.anchor = GridBagConstraints.NORTHWEST;
			c.ipadx = 2;
			c.ipady = 2;
			
			JScrollPane scrollPane = new JScrollPane(inputHolder);
			scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
			scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
			frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
			scrollPane.setSize(normSize);
			inputHolder.setPreferredSize(normSize);
			inputHolder.setSize(normSize);
			Iterator it = myFields.iterator();
				while (it.hasNext()){
					InputPanel help = (InputPanel)(it.next());
					if (help.isForceNewLine()) {
						c.gridwidth = GridBagConstraints.REMAINDER;
						c.fill = GridBagConstraints.HORIZONTAL;
						c.weightx = 0.0;
						c.weighty = 0.0;
						x=0;
						y++;
					}
					else {
						c.gridwidth = 1;
						c.weightx = 1.0;
						c.weighty = 0.0;
						if (x<x_max-1) x++; else { x=0; y++; }
					} 
					c.gridx = x;
					c.gridy = y;
					inputHolder.add(help.getMyPanel(),c);
					if (help.isForceNewLine()) {
						 y++;
						 x = -1;
					}
				}

			//Anzeigen vorbereiten
			frame.setSize(normSize);
			frame.pack();
		}

Nachtrag: die TextAreas befinden sich auf einem Panel, das in der Klasse InputPanel definiert ist.
 

Neue Beiträge

Zurück