GridLayout Basics

blz

Bekanntes Mitglied
Grüß euch zusammen!

Habe vor Kurzem ein bisschen mit der GUI Programmierung begonnen.
Habe gleich auf den oracle pages selbst gelesen, dass sie nicht empfehlen, ein Layout händisch zusammenzubasteln sondern entsprechende unterstützende GUI-Software zu verwenden.

Allerdings dachte ich mir, dass es wahrsch. schon sinnvoll ist, gewisse basics trotzdem zu beherrschen. Habe also angefangen, die einschlägigen Seiten zu studieren ... und es scheint zwar alles ganz hierarchisch und logisch, aber irgendwie funktionierts nie wie es soll!

Mein Mini Projekt:

Ich möchte ein Fenster, das aus zwei Blöcken besteht:
Der linke Block soll 6 Textfelder breit und 8 Textfelder hoch sein (also 48 TFs enthalten).
Dann soll etwas Abstand nach rechts sein und ein zweiter Block mit Textfeldern entstehen.
Jedes Textfeld soll idealerweise genau zwei Ziffern aufnehmen können (andere Eingabe am besten gar nicht erst zulassen)
Dann halt noch ein Button um die Eingaben zu lesen, das wärs schon.

Allerdings bekomm ichs nicht mal hin diese Textfelder anzuordnen ...
Habe gelesen, das GridLayout wäre ideal, da es ein Raster vorgibt.

Ich habe das ganze jetzt mal in eineb Klasse extends JApplet gekleidet.
(Weiß aber nicht wirklich, ob ein Frame, ein JFrame oder ein Applet besser wäre - unmöglich, das herauszufinden ...)

Hier ist mal mein Code-Schnipsel:


Java:
public void init() {
        int maxVGap = 15;
        int maxHGap = 15;
       
        GridLayout gl = new GridLayout(8, 6, 15, 15);
       
        final JPanel contentPane = new JPanel();
        contentPane.setLayout(gl);
       
        // just a fake textfield
        JTextField tf = new JTextField(2);
        Dimension tfDimension = tf.getSize();
       
       
        contentPane.setPreferredSize(new Dimension((int) (tfDimension.getWidth() * 13 + maxHGap * 12), (int) (tfDimension.getHeight() * 8 + maxVGap * 7)));
       
       
        for (int i = 0; i < 48; i++) {
            contentPane.add(new JTextField());
        }                   
       
        setContentPane(contentPane);
}

Seltsamerweise sieht man immer nur ein Textfield oben links, die anderen erscheinen erst, wenn man mit dem Cursor reinspringt. Woran liegt das?
Und ist das jetzt generell richtig und sinnvoll programmiert?
Und wenn ich jetzt den rechten Block dazu machen will, mach ich dann beide Blöcke auf ein Panel und adde die beidem Panel zu meinem contentPane?
 
getSize() liefert die aktuelle Größe der Komponente. Wenn bei einer Komponente noch nie die Größe gesetzt wurde (z.B. durch setSize oder durch einen LayoutManager) liefert getSize() als Ergebnis 0x0. Daher ist tf.getSize() hier 0x0 und somit die Berechnung der Preferred Size fehlerhaft.

Du musst aber die Preferred Size auch garnicht setzen. Das wird automatisch erledigt.
Java:
    final JPanel textFieldPanel = new JPanel();
     textFieldPanel.setLayout( new GridLayout( 8, 6, 15, 15 ) );
     for ( int i = 0; i < 48; i++ ) {
       textFieldPanel.add( new JTextField( 2 ) );
     }
    System.out.println( "panels preferred size: " + textFieldPanel.getPreferredSize() );
Eine Möglichkeit ist es zwei dieser Panels zu erstellen und z.B. zum contentPane hinzuzufügen.

Eine andere mögliche Fehlequelle für das Verhalten mit den erst unsichtbaren Textfeldern ist das Hinzufügen von Komponenten, nachdem der Frame schon sichtbar ist. Daher am besten nochmal kontrollieren, dass der Frame erst auf sichtbar gesetzt wird nachdem das gesamte Layout fertig ist.
 

Zurück
Oben