Größe und Ausrichtung von Komponenten festlegen

PetBe

Mitglied
Hi Leute,

ich habe allgemein sehr große Probleme mit dem Anordnen von Komponenten auf GUIs. Es geht um die Platzierung, Größe und Ausrichtungen. Ich würde gerne mehreren Zeilen (im Beispiel 2) einfügen, sodass 2 Komponenten pro Zeile angeordnet sind, wobei die linke eine Beschreibung (JPanel) und die rechte eine TextFeld (JTextField) ist. Es soll aber so sein, dass die linken Komponenten und die rechten jeweils direkt untereinander stehen. Ich habe folgenden Code:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class zTestGui2 extends JFrame {

   Container c;
   JLabel description;
   JLabel description2;
   JLabel description3;

   JButton button;

   JTextField textField;
   JTextField textField2;
   JTextField textField3;

   JPanel panel1;

   public zTestGui2() {

       c = getContentPane();

       c.setLayout(new BorderLayout());

       panel1 = new JPanel(new FlowLayout());

       description = new JLabel("Testeingabe Nummer 1: ", JLabel.CENTER);

       description.setOpaque(true);
       description.setFont(new Font("Cambria", Font.BOLD, 14));
       panel1.add(description);

       textField = new JTextField();
       Dimension dimension = new Dimension(75, 23);
       textField.setPreferredSize(dimension);
       panel1.add(textField);

       description2 = new JLabel("Das ist die 2. Testeingabe: ", JLabel.CENTER);
       description2.setOpaque(true);
       description2.setFont(new Font("Cambria", Font.BOLD, 14));
       panel1.add(description2);

       textField2 = new JTextField();
       textField2.setPreferredSize(dimension);
       panel1.add(textField2);

       c.add(panel1, BorderLayout.CENTER);

   }

   public static void main(String[] args) {

       zTestGui2 frame = new zTestGui2();
       frame.setTitle("Test Frame");
       frame.setSize(350, 400);
       frame.setVisible(true);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   }
 
}

Das sieht aber alles andere als so aus, wie ich es haben will. Wenn ich jedoch im JPnanel ein GridLayout einstelle (was ja für Tabellen gedacht ist) werden die TextFelder sehr groß und reagieren überhaupt nicht auf "setPreferredSize(dimension)". Kann mir jemand weiterhelfen bzw. mir generelle Tipps für das Vorgehen geben, bei der LayoutGestaltung einer GUI
 

Harry Kane

Top Contributor
Die LayoutManager in Java sind wirklich ein unnötig schwieriges Thema. Ich verwende seit Jahren praktisch nur noch MigLayout. Die Einstiegshürde ist etwas hoch, aber mit einiger Übung lassen sich mit wenig Arbeit auch komplexe Layouts sauber programmieren.
Wenn du die jar runtergeladen hast, kann ich dir gerne beim Einsteig unter die Arme greifen.
 

PetBe

Mitglied
Leider komme ich (als Anfänger was GUIs betrifft) mit den gesamten Dokumentationen für das MigLayout überhaupt nicht klar. Es steht z.B. nicht, welche Datei ich den überhaupt herunterladen soll.

Ich habe mir von der Seite http://www.migcalendar.com/miglayout/versions/4.0/ die miglayout-4.0-swing.jar heruntergeladen und in mein Verzeichnis mit den anderen Klassen kopiert. Ich habe von dem whitepaper (http://www.migcalendar.com/miglayout/mavensite/docs/whitepaper.html) das Beispiel in mein Programm kopiert, bekomme jedoch die Fehlermeldung: "MigLayout cannot be resolved to a type"

Mein Program sieht so aus:
Code:
package generateProfiles;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class zTestGui2 extends JFrame {

   Container c;
   JLabel description;
   JLabel description2;
   JLabel description3;

   JButton button;

   JTextField textField;
   JTextField textField2;
   JTextField textField3;

   JPanel panel1;

   public zTestGui2() {

       c = getContentPane();

       c.setLayout(new BorderLayout());
       // Layout, Column and Row constraints as arguments.
       MigLayout layout = new MigLayout("fillx", "[right]rel[grow,fill]", "[]10[]");
       JPanel panel = new JPanel(layout);

       panel.add(new JLabel("Enter size:"),   "");
       panel.add(new JTextField(""),          "wrap");
       panel.add(new JLabel("Enter weight:"), "");
       panel.add(new JTextField(""),          "");

   }

   public static void main(String[] args) {

       zTestGui2 frame = new zTestGui2();
       frame.setTitle("Test Frame");
       frame.setSize(350, 400);
       frame.setVisible(true);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   }
   
}
[Code\]
 

dzim

Top Contributor
Meine persönliche Meinung: Wenn Anfänger, dann lass Swing - und erst Recht AWT - links liegen. Das ist selbst innerhalb von Java ein totes Pferd. Verwende JavaFX.

Unabhängig davon: Ich habe die GUI-Entwicklung mit Swing, dann SWT, mit WYSIWYG-Tools erlangt. Also graphischen Editoren. Einmal zusammenbasteln und dann den generierten Code anschauen. Irgendwann waren die Editoren dann überflüssig. Swing wird, wenn man eben nicht MigLayout verwendet, gerne Mal als Running Gag für "seltsames" Layouting verwendet. SWT ist - meiner Meinung nach - unter den GUI-Frameworks für Java, immer noch ungeschlagen, benötigt aber a) leider plattformspezifische Bibliotheken und b) ist auch schon etwas angestaubt (immer noch besser als Swing: da liegt ne ganze Dreckschicht drauf! :p). JavaFX ist - ohne Editor - auch manchmal etwas komisch: in Kombination mit dem (einfach zu erstellenden) CSS-Themes, kommt man manchmal auch in WTF-Situationen. Hat man mal HTML5 programmiert, ist das aber nichts so ungewöhnliches. Leider.
 

Thallius

Top Contributor
Meine persönliche Meinung: Wenn Anfänger, dann lass Swing - und erst Recht AWT - links liegen. Das ist selbst innerhalb von Java ein totes Pferd. Verwende JavaFX.

Unabhängig davon: Ich habe die GUI-Entwicklung mit Swing, dann SWT, mit WYSIWYG-Tools erlangt. Also graphischen Editoren. Einmal zusammenbasteln und dann den generierten Code anschauen. Irgendwann waren die Editoren dann überflüssig. Swing wird, wenn man eben nicht MigLayout verwendet, gerne Mal als Running Gag für "seltsames" Layouting verwendet. SWT ist - meiner Meinung nach - unter den GUI-Frameworks für Java, immer noch ungeschlagen, benötigt aber a) leider plattformspezifische Bibliotheken und b) ist auch schon etwas angestaubt (immer noch besser als Swing: da liegt ne ganze Dreckschicht drauf! :p). JavaFX ist - ohne Editor - auch manchmal etwas komisch: in Kombination mit dem (einfach zu erstellenden) CSS-Themes, kommt man manchmal auch in WTF-Situationen. Hat man mal HTML5 programmiert, ist das aber nichts so ungewöhnliches. Leider.

Ich kann Dir da nicht zustimmen. Ich finde Swing gut wenn man weiß was man tut und eben keine Interface Builder benutzt. Ich arbeite zu 100% mit dem Boxlayout und hier kann man wirklich alles abbilden, wenn man mit entsprechend vielen Panels arbeitet, die man entsprechend ineinander verschachtelt. Man muss das Prinzip nur einmal verstanden haben und bei etwas komplexeren UI's sich das Ganze vorher aufzeichnen. Aber im Endeffekt kommt dann genau das raus was ich mir vorstelle.
Ganz im Gegenteil zu HTLM/css wo es ja schon anfängt, dass man es z.B. ohne irgendwelche fürchterlichen Tricks nicht schafft in ein relativ positioniertes div zwei weitere divs auf gleicher Höhe Nebeneinander zu legen. Dieses Gefrickelt kostet mich immer die letzten Nerven.

Gruß

Claus
 

PetBe

Mitglied
Ich habe mich ja jetzt entschlossen MigLayout zu verwenden, so wie es "Harry Kane" mir empfohlen hat. Kann ich denn MigLayout mit JavaFx überhaupt benutzen? Ich denke, ich werde MigLayout mit Swing verwenden, da ich mit Swing schon etwas Erfahrung habe. Alleine Swing - so wie es Thallius vorgeschlagen hat (wenn ich ihn richtig verstanden habe) - finde ich auch sehr umständlich mit der ganzen Verschachtelung von Containern, Layouts und JPanels.

Und könnte jemand bitte Stellung zu meinem oben geposteten Problem nehmen. Das wäre super.
 

Robat

Top Contributor
Und könnte jemand bitte Stellung zu meinem oben geposteten Problem nehmen. Das wäre super.
Welches Problem? Das du bei einem GridLayout die Größe nicht manuell setzen kannst? Bei einem GridLayout sind nun mal alle Komponenten gleich groß und füllen den kompletten Platz aus.

Wenn du mehr Flexibilität willst müsstest du auf eine Verschachtelung versch. Layouts zurückgreifen oder eben mit dem MigLayout weiter machen. (Oder GridBagLayout wovon ich persönlich aber abraten würde).

Gruß Robert
 

PetBe

Mitglied
Ich habe im Prinzip das ursprüngliche Problem, dass ich die Komponenten untereinander anordnen will (siehe erster Post). Da das mit der Verschachtelung wirklich sehr nervenaufreibend ist (um nicht zu sagen primitiv) würde ich gerne MigLayout benutzen. Das habe ich ja probiert ; jedoch bekomme ich eine Fehlermeldung (siehe 2. Post)
 

dzim

Top Contributor
@Thallius:
Ich kann Dir da nicht zustimmen. Ich finde Swing gut wenn man weiß was man tut und eben keine Interface Builder benutzt. Ich arbeite zu 100% mit dem Boxlayout und hier kann man wirklich alles abbilden, wenn man mit entsprechend vielen Panels arbeitet, die man entsprechend ineinander verschachtelt. Man muss das Prinzip nur einmal verstanden haben und bei etwas komplexeren UI's sich das Ganze vorher aufzeichnen. Aber im Endeffekt kommt dann genau das raus was ich mir vorstelle.
Das "Wenn man weiss, was man tut" ist bei allen Frameworks der Knackpunkt. Auch bei nicht-Java.
Ich sage ja auch, dass ich später keinen Editor mehr brauche. Ich schreibe UI-Code für JavaFX entweder im Code oder in FXML, verlasse mich beim letzteren aber nicht auf SceneBuilder.

Ganz im Gegenteil zu HTLM/css wo es ja schon anfängt, dass man es z.B. ohne irgendwelche fürchterlichen Tricks nicht schafft in ein relativ positioniertes div zwei weitere divs auf gleicher Höhe Nebeneinander zu legen. Dieses Gefrickelt kostet mich immer die letzten Nerven.
Ich bin auch kein HTML(5)-Fan, würde aber zur Not zurecht kommen. Gibt ja zum Glück so Dinge wie FlexBox... Aber ja: Es artet schnell aus. Leider.

@PetBe
Kann ich denn MigLayout mit JavaFx überhaupt benutzen?
https://github.com/mikaelgrev/miglayout
Official MiG Layout for Swing, SWT and JavaFX

Alleine Swing - so wie es Thallius vorgeschlagen hat (wenn ich ihn richtig verstanden habe) - finde ich auch sehr umständlich mit der ganzen Verschachtelung von Containern, Layouts und JPanels.
Was ist daran schlimm? Ausser vom Standpunkt der Performance, wo es ab irgendeinen Punkt tatsächlich interessant werden könnte...
Im Gegenteil: Ich finde es z.T. sehr klar, was dann das Ergebnis sein wird. Mal etwas JavaFX-(FXML)-PseudoCode
Code:
<borderlayout id="root">
    <vbox id="container">
        <hbox id="line">
           <label text="Enter Text">
           <textfield>
        </hbox>
    </vbox>
</borderlayout>
Ist trotz geschachtelter Layouts (BorderLayout->VBox->HBox) doch eigentlich recht klar, oder?
 

PetBe

Mitglied
@Thallius:


Was ist daran schlimm? Ausser vom Standpunkt der Performance, wo es ab irgendeinen Punkt tatsächlich interessant werden könnte...
Im Gegenteil: Ich finde es z.T. sehr klar, was dann das Ergebnis sein wird.

Ich finde es sehr schwierig damit eine GUI so zu entwerfen, wie ich sie mir vorstelle. Das ist wirklich sehr verzwickt. Man muss alles schon im Voraus sich überlegen und trotzdem kommen dann immer wieder Probleme auf. Aus diesem Grund habe ich ja nach Rat hier im Forum gefragt (siehe 1. Post). Damit stoße ich zumindest auf sehr große Probleme und das kostet mich wirklich viele Nerven.
Ich habe mir auch immer wieder gedacht: Das kann doch nicht sein, dass das so umständlich alles gemacht werden muss.

Ich probiere es jetzt mal mit MigLayout. Ich denke (und hoffe), dass es so wird wie es "Harry Kane" geschrieben hat (am Anfang vlt. etwas schwieriger, aber danach einfacher als konvetionell mit Swing zu programmieren)



@Thallius:
Mal etwas JavaFX-(FXML)-PseudoCode
Code:
<borderlayout id="root">
    <vbox id="container">
        <hbox id="line">
           <label text="Enter Text">
           <textfield>
        </hbox>
    </vbox>
</borderlayout>
Ist trotz geschachtelter Layouts (BorderLayout->VBox->HBox) doch eigentlich recht klar, oder?

Da ich von HTML und JavaFX überhaupt keine Ahnung habe, verstehe ich den Code auch dementsprechend überhaupt nicht.
 

PetBe

Mitglied
Hi Leute,

ich wollte nur sagen, dass ich MigLayout verwendet habe und schon nach so kurzer Zeit völlig fasziniert davon bin. Ich habe die GUI sofort und ohne irgendwelche Umstände so hinbekommen, wie ich es haben wollte. Das ist einfach unglaublich. Wenn ich bedenke, was diese ganze Verschachtelung mit den Layouts mir für Kopfschmerzen bereitet hat und wie primitiv das ist im Gegensatz zu MigLayout. Mega cool. Danke für den Tipp.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C LayoutManager JFrame größe und ausrichtung + Position von Fensterelementen AWT, Swing, JavaFX & SWT 2
C Swing GridBag-Probleme (Größe und Ausrichtung) AWT, Swing, JavaFX & SWT 3
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
Yonnig JavaFX Größe von WebView an Content anpassen AWT, Swing, JavaFX & SWT 3
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
L JavaFX AnchorPane an die Größe der Scene oder Window binden? AWT, Swing, JavaFX & SWT 3
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
R Größe von Scene und stage an grid anpassen AWT, Swing, JavaFX & SWT 4
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
J Swing Pane im SplitPane automatische Größe aktivieren AWT, Swing, JavaFX & SWT 0
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
Neumi5694 Größe von Komboboxen neu berechnen AWT, Swing, JavaFX & SWT 3
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
C Größe des Mauszeigers ermitteln AWT, Swing, JavaFX & SWT 5
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
F Gui weicht von Designpreview ab (kein fensterrahmen, andere größe) AWT, Swing, JavaFX & SWT 13
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4
M SWT ScrollPane Größe zu klein AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
W GridBagLayout Größe geben AWT, Swing, JavaFX & SWT 1
S Swing JFrame hat nicht die Größe, die ich eingegeben habe AWT, Swing, JavaFX & SWT 3
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
T Swing Größe des Randes AWT, Swing, JavaFX & SWT 2
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
D SWT Window passt Größe nicht an AWT, Swing, JavaFX & SWT 4
N JPanel größe wissen/festlegen vor dem Anzeigen AWT, Swing, JavaFX & SWT 3
U Größe eines Button im Menü ändern AWT, Swing, JavaFX & SWT 1
G JavaFX Größe der Parentknoten AWT, Swing, JavaFX & SWT 5
R JPanel-Größe verändert sich nicht. Warum? AWT, Swing, JavaFX & SWT 5
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
A JPanel oder GridLayout Größe festsetzten AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
SimonRap Swing JFrame Größe zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Größe der JFrame Decorations herausfinden? AWT, Swing, JavaFX & SWT 4
O Swing Jpanel autom. auf JFrame Größe bringen AWT, Swing, JavaFX & SWT 6
M Swing JLabel mit fester größe nachträglich formatieren AWT, Swing, JavaFX & SWT 2
A JComponent Größe AWT, Swing, JavaFX & SWT 8
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
S Swing TextPane größe beschränken AWT, Swing, JavaFX & SWT 2
R Ellipse2D ändert Größe AWT, Swing, JavaFX & SWT 3
H Swing JButton größe ändern AWT, Swing, JavaFX & SWT 5
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
P JPanel Größe ändern AWT, Swing, JavaFX & SWT 22
I Größe eines rotierten Images AWT, Swing, JavaFX & SWT 3
C Button Größe einstellen klappt nicht (setBounds) AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S Die größe eines JButton ändern AWT, Swing, JavaFX & SWT 7
U feste Größe für den Zeichenbereich eines JFrames AWT, Swing, JavaFX & SWT 4
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
P Tatsächliche Größe für Applet AWT, Swing, JavaFX & SWT 3
K JFrame Größe ändern AWT, Swing, JavaFX & SWT 4
M jTable - Größe beim Erzeugen AWT, Swing, JavaFX & SWT 4
hdi Swing JFrame Größe ermitteln AWT, Swing, JavaFX & SWT 6
S Swing jFrame auf maximale Größe setzten AWT, Swing, JavaFX & SWT 7
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
I Größe von JPanel ändern AWT, Swing, JavaFX & SWT 6
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
T Die Größe einer JTextArea an Ihren Parent JPanel anpassen. AWT, Swing, JavaFX & SWT 5
L JFrame größe in einem ActionEvent ändern AWT, Swing, JavaFX & SWT 4
G LayoutManager BorderLayout WEST Bereich auf maximale Größe beschränken AWT, Swing, JavaFX & SWT 19
T Inhalt von einem Tab an JTabbedPane größe ausrichten? AWT, Swing, JavaFX & SWT 2
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
S Button Größe - Anfänger AWT, Swing, JavaFX & SWT 13
0 JPanel nicht an größe des JFrames anpassen AWT, Swing, JavaFX & SWT 3
S Swing Größe von JLabels verändern sich in einem Panel unterschiedlich AWT, Swing, JavaFX & SWT 6
B JPanel Größe regulieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben