# Größe und Ausrichtung von Komponenten festlegen



## PetBe (2. Jun 2017)

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:


```
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 (2. Jun 2017)

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 (4. Jun 2017)

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:

```
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 (5. Jun 2017)

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! ). 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 (5. Jun 2017)

dzim hat gesagt.:


> 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! ). 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 (5. Jun 2017)

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 (5. Jun 2017)

PetBe hat gesagt.:


> 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 (5. Jun 2017)

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)


----------



## Robat (5. Jun 2017)

PetBe hat gesagt.:


> 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.


Du darfst die Datei nicht einfach nur in dein Verzeichnis kopieren. Du musst sie dem Build-Path hinzufügen. Das funktioniert je nach IDE unterschiedlich. Einfach mal googlen.


----------



## dzim (5. Jun 2017)

@Thallius:


Thallius hat gesagt.:


> 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.



Thallius hat gesagt.:


> 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 


PetBe hat gesagt.:


> Kann ich denn MigLayout mit JavaFx überhaupt benutzen?


https://github.com/mikaelgrev/miglayout


> Official MiG Layout for Swing, SWT and JavaFX





PetBe hat gesagt.:


> 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

```
<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 (5. Jun 2017)

dzim hat gesagt.:


> @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)





dzim hat gesagt.:


> @Thallius:
> Mal etwas JavaFX-(FXML)-PseudoCode
> 
> ```
> ...



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


----------



## Thallius (5. Jun 2017)

PetBe hat gesagt.:


> Ich finde es sehr schwierig damit eine GUI so zu entwerfen, wie ich sie mir vorstelle.



Nein ist es nicht. Nimm einen Stift und ein Blatt Papier (Ich hoffe Du weist noch was das ist?  und male es eifnach auf. Dann zerlegst du es immer weiter in kleinere Teile bis du für jedes Element quasi ein Panel hast. Fertig.


----------



## PetBe (5. Jun 2017)

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.


----------



## dzim (5. Jun 2017)

Cool. Hauptsache du kommst ans Ziel. Viel Spass beim basteln, weiterhin!


----------

