Java - GUI ( swing )



  • Hallo Leute,

    ich muss für die Schule ein Projekt machen. Naja, die ganze Klasse macht ein Projekt ( DVD-Verleih Software ) und ich habe den Grafik-Teil übernommen. Ich muss also das GUI für die Software schreiben.
    Dazu habe ich mal ein bisschen durch kleine Tutorials gelesen und dann auch mal ausprobiert. Was mich extrem stört : Wenn ich diese Layout, zB BorderLayout oder GridLayout verwende, also ohne absolute Grössen/Koordinaten arbeite, so wie ich das mit der WinApi gemacht hätte, krieg ich einfach keine Whitspaces hin -.-
    Zum Beispiel :

    import javax.swing.*;
    import java.awt.*;
    public class FirstGUI extends JFrame
    {
    
        private JButton registrieren;
        public FirstGUI()
        {
            super("Login");
            setLocation ( 300 , 300 );
            setSize ( 100, 200 );
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
            getContentPane().setLayout ( new BorderLayout ( 5, 5 ) );
    
            registrieren = new JButton ( "Registrieren" );
            getContentPane().add( registrieren );
            pack();
        }
    }
    

    Jetzt ist dieser Button nicht etwa in der MITTE des Fensters, sondern das Fenster IST der Button. Jeglicher Versuch, das per setSize zu ändern wird auch ignoriert. Irgendwann habe ich für Whitespaces Labels mit vielen Leerzeichen dazugetan .... aber das ist krasser overhead und kann nicht die Lösung sein. Ich BRAUCHE in einem anständigen GUI einfach whitespaces, es können unmöglich alle Elemente direkt aufeinander sein.

    Wenn ich absolute Koordinaten verwende, getContentPane().setLayout ( null ) verwende und mir die Buttons per setSize und setLocation bastle, dann habe ich ein Problem wenn der User das Fenster vergrössert. Mit WinApi würde ich WM_SIZE catchen und dann per MoveWindow die Koordinaten anpassen, aber in Java ... keine Ahnung.

    Hoffe ihr könnt mir helfen, villeicht gibt es auch irgendwo anständige Tut's dazu, habe bis jetzt immer nur 3-Seiten Zeugs gefunden. Und eine Quelle die mir alle möglichen Arten von Elementen gibt, sehr hilfreich, aber hilft bei dem Problem gerade nicht.

    Mfg



  • Das Problem ist, dass GUI zu erstellen mit Java Swing nicht gerade trivial ist. Es ist nicht besonders schwierig, aber man braucht halt etwas Übung.

    In deinem Code setzt du den Login-Button ins CENTER (default bei BorderLayout). Wohin möchtest du denn den Button setzen?

    Mit

    getContentPane().setLayout ( new BorderLayout ( 5, 5 ), BorderLayout.EAST);
    

    kannst du den Button z.B. nur in den rechten Teil des Fensters setzen. (BorderLayout kennt ja NORTH, EAST, SOUTH, WEST, CENTER).

    Ansonsten ist es möglich verschiedene Komponenten zu verschachteln. Wenn du z.B. auf der rechten Seite mehrere Buttons haben möchtest, dann solltest du ein JPanel in den EAST Bereich setzen und dann die JButtons auf den JPanel hinzufügen.

    Probier doch mal den von mir geposteten Methodenaufruf aus.



  • Hmm, dieser setLayout-call, den du gepostet hast compiled bei mir nicht. Diese Funktionssignatur kennt er nicht, sondern nur setLayout(LayoutManager).

    Das mit dem Default-CENTER war mir bekannt, aber selbst wenn ich

    getContentPane().add( BorderLayout.EAST, registrieren );
    

    calle, besteht das Fenster immernoch nurnoch aus diesen Button. Na gut, es ist ein minimaler Whitsspace auf der linken Seite.
    Mein Problem ist, dass ich überhaupt nicht überprüfen kann, was da wie gross ist. Das ist mir echt unangenehm.
    Ich kann also kaum entscheiden, wie das Resultat aussehen soll. Will ich zum Beispiel links ein Anmelde-Button und Rechts ein Registrier-Button und dazwischen Whitspace, würde ich das so versuchen :

    getContentPane().add( BorderLayout.WEST , anmelden );
    getContentPane().add( BorderLayout.EAST , registrieren );
    

    Jetzt müsste ich unten ( SOUTH ) und oben ( NORTH ) wieder IRGENDWAS hinklatschen, nur um zu verhindern, dass die Buttons bis oben und unten durchgehen.
    Außerdem wird das Fenster irgendwie extrem klein erzeugt, dafür dass ich es eig. mit setSize ( 500 , 500 ) initialisiere.



  • Ups, habe die falsche Methode gepostet oben. Aber hast ja die richtige Methode selber gefunden 👍

    Wenn ich aufwändigere GUI gemacht habe verwendete ich oft das GridBagLayout. Damit solltest du so ziemlich alles machen können. Ist leider aber auch etwas kompliziert zu gebrauchen. Am besten liest du mal das Tutorial durch. Bei den Layouts muss man oftmals auch etwas ausprobieren. Ist vieles auch etwas Gefühlssache (geht zumindest mir so).



  • Ok, danke ;P Da werde ich erstmal bisl reinschaune und gucken, ob es das ist was ich brauche ^^



  • Ahaa, dieses Layout gefällt mir doch schon mal wesentlich besser. Wird zwar manchmal wohl nen bisl Rumprobieren sein, aber das ist überall so.

    Ein paar Fragen habe ich noch :

    http://download.oracle.co schrieb:

    fill
    Used when the component's display area is larger than the component's requested size to determine whether and how to resize the component. Valid values (defined as GridBagConstraints constants) include NONE (the default), HORIZONTAL (make the component wide enough to fill its display area horizontally, but do not change its height), VERTICAL (make the component tall enough to fill its display area vertically, but do not change its width), and BOTH (make the component fill its display area entirely).

    Das check ich nicht so wirklich, was das macht. In deinem code, zB für den registrieren-Button verwendest du :

    c.fill = GridBagConstraints.BOTH;
    

    Ich hab das so interpretiert : Wenn der Text oder auch das Bild von einem zb Button zu groß ist, wird dadurch bestimmt, wie der Button resized wird. Aber das scheint nicht zu stimmen, denn wenn ich das auf

    c.fill = GridBagConstraints.NONE;
    

    ändere und den Button so erzeuge :

    registrieren = new JButton("Registrierennnnnnnnnnnnnnnnnnnnnnnnn");
    

    wird der Button trotzdem automatisch groß genug.

    http://download.oracle.co schrieb:

    weightx, weighty
    Specifying weights is an art that can have a significant impact on the appearance of the components a GridBagLayout controls. Weights are used to determine how to distribute space among columns (weightx) and among rows (weighty); this is important for specifying resizing behavior.

    Unless you specify at least one non-zero value for weightx or weighty, all the components clump together in the center of their container. This is because when the weight is 0.0 (the default), the GridBagLayout puts any extra space between its grid of cells and the edges of the container.

    Generally weights are specified with 0.0 and 1.0 as the extremes: the numbers in between are used as necessary. Larger numbers indicate that the component's row or column should get more space. For each column, the weight is related to the highest weightx specified for a component within that column, with each multicolumn component's weight being split somehow between the columns the component is in. Similarly, each row's weight is related to the highest weighty specified for a component within that row. Extra space tends to go toward the rightmost column and bottom row.

    Ist mir auch irgendwie unklar 😕 Soll das festlegen, welcher Teil einer Komponente stärker vergrössert wird, wenn das Fenster vergrössert wird ? Oder was genau ist das ?

    Auch scheint mir ipady und ipadx ziemlich ähnlich zu gridheight und gridwidth ;O

    Mfg



  • Zum fill:
    Mit der Methode fill kannst du angeben, wie deine Komponente sich verhalten soll, wenn du mehr Platz hast, also deine Komponente eigentlich braucht. Mit BOTH sagst du, deine Komponente soll sich dann in alle Richtungen vergrössern. NONE sagt in keine Richtung. Dann gibts noch NORTH, SOUTH...

    Zu weightx, weighty:
    Ich glaube du hast das richtig verstanden. Damit kannst du einfach angeben, wie viel eine Komponente vergrössert oder verkleinert werden soll, wenn die Fenstergrösse verändert wird. Gibst du 0.1 an wird sich die Komponente nur sehr weniger vergrössern. Mit 0.9 wird sie sich dann stark ändern.

    Ich habe ipadx und ipady noch nie gebraucht. Aber so wie ich das verstehe macht es das folgende: ipadx und ipady bestimmen, wie die Komponente intern "aufgefüllt, ausgepolstert" wird, also wie gross der Rand der Komponente zu ihrem Umfeld ist. (Bin mir jetzt aber nicht 100% sicher, ob ich das richtig verstanden habe. Ich denke das braucht man aber auch nicht wirklich).



  • BTW: Für Formular-Dialoge (bspw. Login-Formular) ist das MiG-Layout http://www.miglayout.com/ sehr schön und sehr einfach zu verwenden. Mir gefällt es sehr 👍

    MfG SideWinder



  • @ icarus2 Achso, das macht mehr Sinn ^^ Ich werde mal bisschen mit dem weight rumspielen und sehen was bei raus kommt. Insgesammt sehr interessant dieses Layout !

    @ SideWinder Hm, das Layout sieht auch sehr nice aus, vor allem bequem 😉 Hab mich mal bisl durch die .PDF gelesen. Das Problem ist nur, dass wir an den Schul-PC's absolute NICHTS downloaden dürfen, wir haben also BlueJ ( -.- ) und sonst nichts zur verfügung ;P



  • SideWinder schrieb:

    BTW: Für Formular-Dialoge (bspw. Login-Formular) ist das MiG-Layout http://www.miglayout.com/ sehr schön und sehr einfach zu verwenden. Mir gefällt es sehr 👍

    Ui, den kannte ich noch gar nicht. Bei Gelegenheit mal ausprobieren *bookmark* Danke!


Anmelden zum Antworten