tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Akeshihiro
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1268
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    Hallo,

    Wie wird in der Regel eine komplexe GUI aufgebaut?

    Nimmt man dazu GridBagLayout, dessen Verwendung ich nicht gerade trivial finde.

    Oder verteilt man die Steuerelemente
    zu verschiedenen Panels und Containern und
    verschachtelt diese dann mit eventuell verschiedenen
    Layout- Klassen (FlowLayout, GridLayout, BorderLayout...).
    Muss also alles mühselig ausgetüfftelt werden!?

    Vor vielen Jahren habe ich mal mit VB5 GUIs erstellt. Das war
    VIEL einfacher.
    Gibt es in Java auch so eine bequeme Lösung?

    Und noch ein Problem.

    setSize( 80, 120) und setBounds(...) scheint nicht zu klappen.
    Was muss ich nehmen, wenn ich die Größe und Position einzelner Swing-Steuerelemente
    verändern will.
    Ich habe den Eindruck, dass setSize( 80, 120) und setBounds(...) garnicht geht, wenn die Steuerelemente z.B. mit einem GridLayout angeordnet sind.

    Vielen Dank für hilfreiche Hinweise

    Steve222
     

  2. #2
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Damit die Methoden setSize(), setLocation() und setBounds() greifen, müsstest du das s.g. NullLayout verwenden. Ist keine große Sache, einfach null an setLayout() übergeben.
    Code java:
    1
    
    setLayout(null);
    Nun kannst du die Komponenten positionieren wie du willst und ihnen ihre Größen zuweisen.

    Zu den LayoutManagern:
    Wie du deine Komponenten anordnest, ist allein deine Sache. Wenn du keine LayoutManager verwenden willst, dann is das eben so. Wenn du statt GBL lieber auf verschachtelte und unüberschaubare Strukturen schwörst, dann ist das eben so. Du solltest dann aber die Verhaltensmuster der jeweiligen LayoutManager kennen, damit du sie richtig einsetzen kannst. Einige ziehen ihre Komponenten auseinander, andere geben ihnen feste Größen, einige verändern Position und Größe, wenn die Fenstergröße verändert wird, andere tun dies nicht. Je nachdem wie komplex die GUI wird, hat man schnell eine Struktur von Panels und LayoutManagern, die kein Mensch mehr überblickt. Um das alles zu entrümpeln kann man z.B. GridBagLayout (GBL) verwenden. Die Verwendung ist eigentlich super einfach und vor allem sehr dynamisch, man kann jeder Komponente eigene Verhaltensmuster zuweisen, z.B. feste Größe oder dass sie sich selbst anpasst, Andocken an Himmelsrichtungen, Nutzung des vorhandenen Platzes, Position und und und. Eine Alternative zum GBL ist das TableLayout, dieses ist aber eine externe Bibliothek. Die Verwendung ist für viele scheinbar leichter als die des GBL, aber naja, jedem das Seine Google einfach nach java TableLayout tutorial und gleich der erste Link, dann kannst du dir das ja mal anschauen.

    EDIT:
    Was genau findest du denn am GBL so nicht-trivial? Das sagen viele, auch in Büchern heißt es oft so, aber mir ist einfach nicht klar warum. Eigentlich ist die Verwendung super simpel, man muss sich nur im Vorfeld Gedanken über den Aufbau der GUI machen, z.B. durch Skizzen, aber das ist immer der Fall, weil niemand hat Lust auf ständiges Rumkorrigieren der GUI, also muss man sie eben erstmal skizzieren.
    Geändert von Akeshihiro (06.07.10 um 12:51 Uhr)
    Steve222 bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  3. #3
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    Hi Akeshihiro,

    und Danke für die Antwort.

    Du scheinst für die Nutzung von GridBagLayout zu plädieren. Vielleicht sollte ich mich
    auf den Weg machen und mir das draufschaffen.
    Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
    manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?

    Beim Arbeiten ohne GridBagLayout:
    Leider hatte ich mit Deinem Hinweis setLayout(null); keinen Erfolg.
    setSize(...) und setBounds(...) tun immer noch nichts.

    Viele Grüße

    Steve222
     

  4. #4
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    schau dir mal das FormLayout von JGoodies an, das ist eigentlich recht einfach und genau so mächtig wie das GridBagLayout.

    http://www.jgoodies.com/freeware/forms/

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Zitat Zitat von Steve222 Beitrag anzeigen
    Hi Akeshihiro,

    und Danke für die Antwort.

    Du scheinst für die Nutzung von GridBagLayout zu plädieren. Vielleicht sollte ich mich
    auf den Weg machen und mir das draufschaffen.
    Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
    manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?

    Beim Arbeiten ohne GridBagLayout:
    Leider hatte ich mit Deinem Hinweis setLayout(null); keinen Erfolg.
    setSize(...) und setBounds(...) tun immer noch nichts.

    Viele Grüße

    Steve222
    Beispiel für ein NullLayout:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    package de.tutorials.steve222.layouts;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class NullLayoutExample extends JFrame {
        private static final long   serialVersionUID    = -1995332610799739537L;
     
        public NullLayoutExample() {
            setTitle(getClass().getName());
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            
            setLayout(null);
            
            JButton bt = new JButton("hallo");
            bt.setBounds(50, 50, 150, 25);
            add(bt);
            
            bt = new JButton("ok");
            bt.setBounds(200, 100, 200, 90);
            add(bt);
            
            setSize(500, 500);
            setLocationRelativeTo(null);
            setVisible(true);
        }
        
        public static void main(String[] args) {
            new NullLayoutExample();
        }
    }
    Funktioniert einwandfrei.

    Also ich plädire zu gar nix und ich zwinge auch niemanden GBL zu verwenden, mache ich ja auch nicht immer. Man muss einfach abwägen, ob es Sinn macht. Wenn die GUI eher klein ist und kaum Komponenten hat, dann würde es fast schon Sinn machen sich lieber mit den anderen LayoutManagern zu befassen und 1, 2 oder 3 Panels mehr einzufügen (kommt natürlich drauf an, wie das ganze aufgebaut ist). Bei eher komplexeren würde dies aber die Übersicht negativ beieinflussen und wenn mal was geändert werden muss, z.B. neue Komponenten kommen hinzu, dann müsste man eventuell nochmal alles aufreißen. Beim GBL würden einige Komponenten eventuell neue Koordinaten bekommen, aber mehr passiert dann auch nicht.

    Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
    manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?
    Ja, kann man. Mit der Eigenschaft fill kann man bestimmen, wie sich die Komponenten ausdehnen sollen, also horizontal, vertical, beides oder nix davon. Mit weightx und weighty kannst du dann noch bestimmen, was mit dem freien Platz passieren soll, der beim vergrößern des Fensters entsteht. Das ist allerdings eine relative angabe, also quasi prozentual. Wenn z.B. eine Komponenten bei weightx 0.5 zugewiesen bekommt und eine andere 3.0, dann wäre es so, dass die zweite Komponente ja mehr Platz in Anspruch nehmen wird. Die erste Komponenten bekommt also nur 16.66% und die zweite eben den Rest (ich hoffe ich hab mich nicht verrechnet xD). Wie groß die Zahlen im Endeffekt sind, ist egal, es kommt nur auf den relativen Vergleich an.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  6. #6
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    Hi Akeshihiro,
    und danke nochmals für die Tipps.
    Du bist der Ansicht, dass das GridBagLayout beherrschbar ist, wenn man sich ausreichend damit beschäftigt.
    Es geschehen dann keine unvorhergesehen "Dinge" mehr, wenn man bereit ist das GridBagLayout richtig kennenzulernen. Dieser Hinweis ist für mich hilfreich und ich werde mich somit noch weiter mit dem GridBagLayout
    beschäftigen um es möglichst auch zu beherrschen

    Auch der Code "NullLayoutExample" von Dir hat mir gezeigt, dass man auch sehr gut eine GUI ganz ohne
    LayoutManager gestalten kann. Auch das ist ein nüzlicher Hinweis. Danke!

    Noch was anderes:
    In der API heisst es zwar bei GridLayout: "...All components in the layout are given equal size."

    Ich hatte mir aber bislang vorgestellt, dass auch bei (während) der Verwendung von
    "setLayout(new GridLayout(3,2));" mit setSize(...) und setBounds(...) zumindest Größe und evtl auch Position der Steuerelemente trotzdem geändert werden kann.

    Das geht wohl offenkundig (nach eigenen Tests) nicht, oder doch?

    Viele Grüße
    Steve222
     

  7. #7
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Beim GridLayout werden die Komponenten auf die gesamte Größe der Gitter-Felder auseinander gezogen. Soweit ich weiß, kann man keine feste Größe verwenden. Ein Workaround wäre, dass man sich nen temporäres Panel erzeugt, dort das NullLayout verwendet und die Komponente mit entsprechender Größe positioniert. Die Frage ist natürlich, in wie weit das Ganze sinnvoll nutzbar ist, denn für jedes Feld ein Panel-Objekt erzeugen ist ja auch nicht die Lösung, jedenfalls nicht, wenn nur eine Komponente rein soll.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    warum schaust du dir denn nicht mal das FormLayout an, wie ich oben schon mal vorgeschlagen hab? Es ist wesentlich leichter zu nutzen, als das GridbagLayout.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

Ähnliche Themen

  1. GridBagLayout
    Von ElJarno im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 15.06.10, 10:26
  2. GridBagLayout
    Von FrankBooth im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 07.12.09, 14:53
  3. GridBagLayout
    Von MScalli im Forum Java
    Antworten: 3
    Letzter Beitrag: 15.02.08, 10:15
  4. GridBagLayout
    Von MariusMeier im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 22.01.08, 10:48
  5. GridBagLayout
    Von soa im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 09.08.07, 19:30