ComboBoxModel addElement verändert Layout

Jesfreric

Aktives Mitglied
Liebe Community

Ich habe ein kleines Problem. Ich erstelle gerade ein GUI und habe dazu ein GridBagLayout Manager gewählt. Alle Elemente liegen an Ort und Stelle, die Zwischenräume habe ich mit leeren JLabels gefüllt (das soll aber mal jetzt keine so große Rolle spielen).
Die Größenangaben erfolgten über „setPreferredSize“.
Mein Problem ist nun, dass ich zwei JComboBox-Auswahlfelder habe. Wähle ich bei der ersten einen Eintrag aus, so verändern sich die Werte der zweiten Auswahlbox automatisch. Soweit so gut, allerdings verändern sich die Proportionen sobald ich den Auswahl aus Liste 1 tätige. Selbst das Ändern von setPreferredSize zu setMaximumSize bringt gar nichts.

Habt ihr eine Idee? Kann man dem Layout-Manager nicht einfach sagen: „Lass die Größen so, komme was wolle!!!“.
Viele Grüße
Richi
 

empty23

Mitglied
Wenn du ein GridBagLayout verwendest, dann musst du die Elemente mit passenden GridBagConstraints auf der GUI einfügen. Die Größe der Elemente selbst spielt bei diesem Layout keine Rolle, die gesamte Größenberechnung basiert auf Constraints. Ohne konkreten Code, kann ich dir jetzt leider schlecht weiterhelfen. Vielleicht hilft dir das offizielle Tutorial etwas: How to Use GridBagLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

PS: Leere JLabels als Platzhalter zu benutzen ist nicht die Lösung. Auch hier über die Layoutoptionen gehen. Man kann angeben wie viele Spalten/Zeilen es geben soll und wie groß eine Spalte bzw. Zeile sein soll. Willst du einen Abstand haben, dann wird einfach eine entsprechende leere Spalte / Zeile eingefügt.
 
Zuletzt bearbeitet:

Jesfreric

Aktives Mitglied
Hi

Danke für deine Antwort. Das habe ich tatsächlich gemacht. Für jedes Contraints habe ich
setPreferredSize( new Dimensin(...));
gridx = ;
gridy = ;
gridwidth = ;
gridheight = ;
weightx = ;
weighty = ;
.fill = GridBagContraints.BOTH;

geht leider trotzdem nicht. Ohne die leeren Labels wurde immer irgendwas aneinander ausgerichtet, nur nicht so wie ich es wollte :-/
 

empty23

Mitglied
Vielleich etwas ausführlicher: Zuerst musst du angeben wieviele Zeilen / Spalten du in deinem Layout haben willst. Das machst du am besten direkt dann, wenn du das Layout erzeugst:

Java:
       GridBagLayout gridBagLayout = new GridBagLayout();
       gridBagLayout.columnWidths = new int[] { 20, 100, 100, 20, 0 };
       gridBagLayout.rowHeights = new int[] { 20, 200, 200, 20, 0 };
       gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE };
       gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
Wenn du das so gemacht hast, dann hast du deinem Layout gesagt: Ich will vier Zeilen und vier Spalten. Die erste Spalte ist 20x20px groß, die zweite ist 100x200, de dritte 100x200, die vierte 20x20 (es gibt keine fünfte Spalte, jedes dieser Arrays muss nur mit 0 aufhören). Die Weights geben an, wie die Spalten bzw. Zeilen wachsen sollen. In diesem Fall wächst die dritte Spalte (falls mehr Platz als notwendig zur Verfügung ist) in die Breite und die zweite Zeile in die Höhe.

Danach kannst du einfach bei jeder Komponente, die du am Layout haben willst eigene Constraints definieren:

Java:
JLabel labelUsername = new JLabel("Username");

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;

// container ist dein Panel etc. wo das Layout drauf ist
container.add(labelUsername, gbc);
In dem Fall legst du das Label in die erste Spalte der ersten Zeile.

Wenn du jetzt z.B. eine leere Spalte dazwischen haben willst, fügst du beim Erzeugen des Layouts die Spalte dazu (nicht vergessen auch einen Eintrag im weights Array zu erzeugen) und hast dann deinen Abstand im resultierenden Layout.

Die Eigenschaften vom Constraint wie z.B. .fill etc. legen das Verhalten der Komponente in ihrer jeweiligen "Zelle" fest. D.h. selbst wenn du als .fill = BOTH setzt, wird die "Zelle" selbst nicht größer werden, sondern die Komponente darin einfach den gesamten Platz einnehmen.
 
Zuletzt bearbeitet:

Jesfreric

Aktives Mitglied
Hi,

Danke für deine Antwort. Mir war nicht klar, dass es dafür eine Methode gibt. Allerdings funktioniert die Vorgehensweise nicht. Das GridBagLayout befindet sich in einer Klasse, die JPanel erweitert (class ... extends JPanel). Demnach habe ich das Layout nur mir setLayout() im Konstruktor erstellt ohne vorher ein extra JPanel zu erstellen. Wenn ich jetzt einfach nur columnWidths = ... eingebe kommt eine Fehlermeldung, dass die Variable columnWidths nicht gefunden wird.
Wie könnte ich die Methode in diesem Fall anwenden?

Viele Grüße
Richi
 

empty23

Mitglied
Ich versteh jetzt gerade das Problem nicht. Du erstellst im Konstruktor einfach ein GridBagLayout (das müsstest du ohnehin schon irgendwo machen) und weißt dann dem erstellten Layout die Eigenschaft columnWidths zu. Du kannst im Prinzip meinen Code von oben (zur Erstellung des Layouts) einfach übernehmen. Dann mit setLayout(...) das neu erstellte Layout dem Panel zuweisen.
 

Jesfreric

Aktives Mitglied
Hi

Ich habe die Änderungen so vorgenommen und es hat vieles in meinem Code vereinfacht, leider wird aus einem mir nicht ersichtlichen Grund das Layout immer noch geändert...
Wahrscheinlicb müsste ich einfach mal den Code posten...
Wobei das mittlweile 2000 Zeilen sind...

Viele Grüße
Richi
 

Jesfreric

Aktives Mitglied
Vielleicht eine mögliche Erklärung:
Wenn ich einen Wert aus Liste 1 gewählt habe, dann wird Liste zwei zunächst geleert und dann Elemente je nach Auswahl hinzugefügt. Könnte dieses Hinzufügen unter Umständen zu einer Neuausrichtung des Layouts führen??...
 

empty23

Mitglied
Das sollte im Normalfall keine Rolle spielen. Wenn das Layout entsprechend konfiguriert ist, dann bekommst du auch dieses Verhalten weg. Ohne konkreten Code kann ich dir in dem Fall nicht weiterhelfen (aber bitte poste jetzt keine 2000 Zeilen, sondern beschränke dich auf das Wesentliche). Überprüf auch nochmal ob die Gewichungen (columnWeights) richtig konfiguriert sind. Wenn du z.B. der Spalte, in der die Liste1 drin ist eine Gewichtung > 0 gibst und der anderen Spalte (mit der Liste2 drin) eine Gewichtung von 0, dann ist klar, dass sich die Größenverhältnisse ändern können, wenn durch eine Änderung in der Liste selbst weniger Platz nötig ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing Generisches ComboBoxModel AWT, Swing, JavaFX & SWT 2
G Eigenes ComboBoxModel AWT, Swing, JavaFX & SWT 2
TheJavaKid addElement/addItem bei JList AWT, Swing, JavaFX & SWT 5
F [JList] mit addElement einen Eintrag hinzufügen AWT, Swing, JavaFX & SWT 3
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
X mouseover verändert ungewollt die farbe AWT, Swing, JavaFX & SWT 4
S g.setStroke verändert auch Buttonrahmen AWT, Swing, JavaFX & SWT 2
R JPanel-Größe verändert sich nicht. Warum? AWT, Swing, JavaFX & SWT 5
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
R Fensterinhalt erscheint erst, wenn das Fenster verändert wird AWT, Swing, JavaFX & SWT 7
N Button akivieren, wenn Tabelle verändert worden ist AWT, Swing, JavaFX & SWT 2
S JScrollpane verändert sich? AWT, Swing, JavaFX & SWT 5
J Menü beschriftung wird nicht verändert AWT, Swing, JavaFX & SWT 7
V JTable - SelectionMode wird durch RowFilter verändert AWT, Swing, JavaFX & SWT 2
R LayoutManager GridLayout verändert isch andauernd AWT, Swing, JavaFX & SWT 4
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
J JComboBox verändert Größe sobald editierbar AWT, Swing, JavaFX & SWT 2
L GridLayout verändert festgesetzte Größe der Komponenten AWT, Swing, JavaFX & SWT 12
N Die Zeile einer JTable verändert beim klicken ihre Farbe? AWT, Swing, JavaFX & SWT 7
K Fenstergröße soll nicht verändert werden AWT, Swing, JavaFX & SWT 2
V JComboBox-Größe verändert sich im GridBagLayout AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben