Breite von Textfeldern trotz Layoutmanager

uwe_P

Mitglied
Hallo,
ich probiere gerade die Layoutmanager aus und habe nun folgendes Problem:

1.)Wenn ich meinem Frame keinen Größenwert Mitgebe, startet es immer Minimiert, anstatt in der Mindestgröße der Panel und deren Inhalt.

2.) Wenn ich das Fenster dann vergrößer, werden mit die leeren JTextfelder auch nur minimiert angezeigt. Warum? Ein JTextfield.setSize(); hat keine Auswirkung.

Danke für Eure Hilfe.

Gruß

Uwe

Java:
import javax.swing.*;
import java.awt.*;

public class Test extends JFrame{
        public static void main(String[] args){         
            Test uev = new Test();     
        }
    

    private static final long serialVersionUID = 1;
    
    JPanel p_eingabe = new JPanel();
    JPanel p_kunde = new JPanel();
    JPanel p_quelle = new JPanel();
        
    JLabel lb_quelle = new JLabel();
    JLabel lb_kunde = new JLabel();
    
    JTextField tf_quelle = new JTextField();
    JTextField tf_kunde = new JTextField();





    public Test()
    {
        this.setTitle("Hier kommt ein Titel");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setLayout(new BorderLayout());
      this.setVisible(true);
      this.eingabe();
      
        
    }

    public void eingabe(){
        p_eingabe.setLayout(new GridLayout(7,1));
        p_eingabe.setBorder( BorderFactory.createLineBorder(Color.black ));
            p_kunde.setLayout(new FlowLayout(FlowLayout.LEFT ));
            p_kunde.setBorder( BorderFactory.createLineBorder(Color.black ));
                lb_kunde.setText("Kunde: ");
                lb_kunde.setVisible(true);
                tf_kunde.setText("Bitte aus PhraseExpress \u00fcbernehmen!");
                 tf_kunde.setVisible(true);
             p_kunde.add(lb_kunde);
             p_kunde.add(tf_kunde);
        p_eingabe.add(p_kunde);
            p_quelle.setLayout(new FlowLayout(FlowLayout.LEFT ));
            p_quelle.setBorder( BorderFactory.createLineBorder(Color.black ));
                lb_quelle.setText("Quelle: ");
                lb_quelle.setVisible(true);
                tf_quelle.setText("");
                tf_quelle.setVisible(true);
                tf_quelle.setSize(500,20);
            p_quelle.add(lb_quelle);
            p_quelle.add(tf_quelle);
        p_eingabe.add(p_quelle);
        this.add(p_eingabe,BorderLayout.CENTER);   
    }
}       
            
            
            
            
            
    /*
        p_ziel = new JPanel();
        p_datei = new JPanel();

    
        
        

                
                        lb_ziel.setText("Ziel");
                lb_ziel.setVisible(true);
        
        
        
        lb_dateipfad.setText("Pfad f\u00fcr UserExit");
        lb_dateipfad.setVisible(true);
        
            
        p_eingabe.add(lb_quellpfad);
        
        
        p_eingabe.add(tf_kunde);
        p_eingabe.add(lb_quellpfad);
        p_eingabe.add(lb_zielpfad);
        p_eingabe.add(lb_dateipfad);
    
        */
        /*       
        lb_newbpd = new JLabel("BPD-Name");
      lb_newbpd.setVisible(true);
            
      lb_oldbpd = new JLabel("Bereits eingegebene BPD's");
    lb_oldbpd.setBounds(50,400,300,30);
    lb_oldbpd.setVisible(true);
          
       lb_format = new JLabel("Auszugsformat");
         lb_format.setBounds(440,400,100,30);
         lb_format.setVisible(true);
                
       lb_aa = new JLabel("Auftragsart");
         lb_aa.setBounds(560,400,200,30);
         lb_aa.setVisible(true);
            
    lb_dir = new JLabel("Ordner/Dateiname");
      lb_dir.setBounds(670,350,100,30);
      lb_dir.setVisible(true);
            
      lb_olddir = new JLabel("Bereits eingegebene Ordner-/Dateinamen");
    lb_olddir.setBounds(670,400,300,30);
    lb_olddir.setVisible(true);
    
    
    lb_ordner = new JLabel("Soll ein Ordner f\u00dcr jede BPD angelegt werden?");
    lb_ordner.setBounds(50,570,300,30);
    lb_ordner.setVisible(true);
    
    
    lb_datum = new JLabel("Mit Datum im Dateinamen?");
    lb_datum.setBounds(470,570,170,30);
    lb_datum.setVisible(true);
    
    */
 
1. Du fügst die Komponenten erst nach dem Sichtbarmachen hinzu.
2. Pack fehlt
Java:
        this.eingabe();
        this.pack();
        this.setVisible(true);
und am besten vor setVisible (und nach pack()) noch
Code:
this.setLocationRelativeTo(null);
 
Hey Mega, hat super Funktioniert. Nur noch eine Frage: "Wie setze ich denn innerhalb eines JPanels die Größe meiner Textfelder? Ein leeres JTextfeld wird auch nur ganz schmal angezeigt?
 
Du kannst z.B. den Columns-Wert setzen.
Wenn es aber z.B. auf Breite gestreckt werden soll, dann brauchst du den entsprechenden Layoutmanager.

Lass die Finger von PreferredSize, das skaliert nicht, wenn du z.B. die Schriftgröße änderst. PreferredSize ist dazu da, einem Element eine fixe Größe zu geben.
 
Nur noch eine Frage: "Wie setze ich denn innerhalb eines JPanels die Größe meiner Textfelder? Ein leeres JTextfeld wird auch nur ganz schmal angezeigt?
Komponenten haben innerhalb ihres Containers eine Lage und Größe (bounds bzw. location und size). Die könntest Du selbst bestimmen, wenn Du ohne Layout-Manager arbeiten würdest, was nicht zu empfehlen ist.

Der Layout-Manager übernimmt zwei Teilaufgaben:

a) er berechnet die bevorzugte Größe des Containers
b) er verteilt die Komponenten auf den im Container zur Verfügung stehenden Platz (er bestimmt also Position und Größe, die Bounds, der Komponenten).

Dazu bedient er sich in der Regel mind. der bevorzugten Größe der Komponenten, die der Container enthält. Allerdings sind bevorzugte Größe, minimale und maximale Größe lediglich als Hinweise an den Layout-Manager zu verstehen. Die Bounds (location und size) geben dagegen die tatsächliche Größe und Lage der Komponente innerhalb ihres Containers an.

Wir können uns ja mal ein einfaches Layout wie FlowLayout ansehen, wobei wir ein paar Eigenschaften unberücksichtigt lassen.

FlowLayout lagert Komponenten nebeneinander aus. Wenn sie keinen Platz mehr haben, wird umgebrochen. Was also ist die bevorzugte Größe eines Containers mit FlowLayout? Ganz einfach: die Breite und Höhe einer Zeile, in der sich alle Komponenten der Reihe nach nebeneinander befinden.

Wenn die bevorzugte Größe eines JPanels mit FlowLayout abgerufen wird, dann wird das FlowLayout nach der bevorzugten Größe des JPanels gefragt. Das FlowLayout nimmt nun alle Komponenten, die sich in dem JPanel befinden und lässt sich von diesen die bevorzugte Größe zurückgeben. Dabei merkt man sich die maximale Höhe und addiert alle Breiten zu einer Gesamtbreite. Das ist dann eben die bevorzugte Größe des JPanels. Teilufgabe a) erschlagen.

Kommen wir zu Teilaufgabe b), in der es nun um das tatsächliche "Layouten" geht. Das FlowLayout bekommt nun den Container, der zu diesem Zeitpunkt bereits eine Größe besitzt. Jetzt wird eine Komponente nach der andern nebeneinander gesetzt (man merkt sich dabei die bisherige maximale Höhe) - bis eben kein Platz mehr ist. Dann wird in die nächste Zeile gesprungen (y-Koordinate wird um die bisherige maximale Höhe erhöht) und von vorne begonnen. Das macht man so lange, bis alle noch sichtbaren Komponenten ausgelagert sind.

Es gibt noch eine Besonderheit, wenn man die preferred Size einer Komponente explizit setzt: dann nämlich wird die bevorzugte Größe nicht mehr berechnet. Insofern ist der Hinweis von @Neumi5694 vollkommen richtig; wenn Du die preferred Size des Textfelds setzt, skaliert nichts mehr (zumindest nicht nach oben).

Welche Möglichkeiten hast Du?
  1. Bei JTextField kannst Du die Spalten angeben. Dann berechnet das JTextField seine bevorzugte Größe anhand der Spaltenanzahl (die Breite einer Spalte entspricht dem Buchstaben m).
  2. Du kannst versuchen, die minimale Größe festzulegen. Das erfordert allerdings einen LayoutManager, der diese berücksichtigt.
  3. Du verwendest einen geeigneten LayoutManager (GridBagLayout kann so ziemlich alles, ist aber nicht ganz unkompliziert)
  4. Du schreibst einen eigenen LayoutManager (nur, wenn es gar nicht anders geht).
Das mal als kleine Übersicht, ich hoffe, kann sein, dass ich noch was vergessen habe - die Möglichkeiten sind mannigfaltig.
 

Zurück
Oben