Kay: Größe von JFrame

Hallo,

ich leite eine Klasse von JFrame ab und setze verschiedene Eigenschaften, unter anderem das Layout "BorderLayout".
Nun habe ich zwei JPanels erstellt: pnOben und pnUnten.
In das obere Panel lege ich verschiedene JLabel- und JTextField-Komponenten.
Dann füge ich das Panel in "CENTER" ein:
getContentPane().add(pnOben, BorderLayout.CENTER);
In das untere Panel lege ich verschiedene JButton-Komponenten und füge es anschließend in "SOUTH" ein:
getContentPane().add(pnUnten, BorderLayout.SOUTH);

Nun zu meinem Problem:
Da das Fenster zu klein ist, werden nicht alle Komponenten ordnungsgemäß angezeigt.
Nun kann ich natürlich mit "setSize" eine größere Breite und Höhe angeben - das finde ich jedoch etwas unpraktikabel, da ich die korrekte Größe durch Probieren ermitteln müsste.
Gibt es eine Möglichkeit, das Fenster zu maximieren, also auf die maximale Breite und Höhe zu setzen?

Nun könnte es ja sein, dass dieses maximierte Fenster immer noch zu klein ist. Gibt es eine Möglichkeit, Scroll-Balken festzulegen?
Ich hätte dazu nur die folgende Idee:
Ich erstelle ein weiteres Panel mit beispielsweise dem Name "pnHaupt". Bei diesem Panel lege ich das Layout auf "BorderLayout" fest und füge dort die Panels "pnOben" und "pnUnten" hinzu. Das Haupt-Panel lege ich anschließend in eine ScrollPane und diese dann letzt endlich auf das Hauptfenster.
Das ganze könnte dann also wie folgt aussehen:
pnHaupt = new JPanel(new BorderLayout());
pnHaupt.add(pnOben, BorderLayout.CENTER);
pnHaupt.add(pnUnten, BorderLayout.SOUTH);
scrollPane = new JScrollPane(pnHaupt);
getContentPane().add(scrollPane, BorderLayout.CENTER);

Diese Lösung finde ich jedoch ziemlich aufwändig - vielleicht gibt's noch 'ne einfachere Variante?

Vielen Dank und viele Grüße,
Kay

  1. Hallo Kay,

    Gibt es eine Möglichkeit, das Fenster zu maximieren, also auf die maximale Breite und Höhe zu setzen?

    Eine Suche nach "java maximize jframe" liefert mir gleich als erstes Suchergebnis einen Volltreffer. ;-)

    Nun könnte es ja sein, dass dieses maximierte Fenster immer noch zu klein ist. Gibt es eine Möglichkeit, Scroll-Balken festzulegen?

    Ja, und zwar genau mit der Methode eines JScrollPane, wie du sie unten beschrieben hattest.

    Mein Code sieht da meist wie folgt aus (ungetestet, ohne Imports):

    public class TestClass {  
      public static void main(String[] args) {  
        // Frame erstellen  
        JFrame frame = new JFrame("Titel");  
        // alternativ auch:  
        MyJFrame frame = new MyJFrame("Titel");  
      
        // einzelne Komponenten erstellen  
          // pnOben und pnUnten hier erstellen, beispielsweise so:  
        PnOben pnOben = new PnOben();  
        PnUnten pnUnten = new PnUnten();  
      
        // Gesamtpanel erstellen (inkl. Layout), das einen Scrollbalken haben soll  
        JPanel panel = new JPanel(new BorderLayout());  
      
        // Komponenten dem Gesamtpanel hinzufügen  
        panel.add(pnOben, BorderLayout.CENTER);  
        panel.add(pnUnten, BorderLayout.SOUTH);  
      
        // Panel dem Frame hinzufügen, oder aber vorher noch Scrollbalken festlegen, so wie hier  
        JFrame.add(new JScrollPane(panel));  
      
      }  
    }
    

    Einfacher als die von dir beschriebene Methode geht es also nicht unbedingt, denn du brauchst immer einen Container, der für den/die Scrollbalken zuständig ist. Man muss sich bei Java erst mal daran gewöhnen.

    Es gibt natürlich auch GUIs, die dir dabei helfen können, die Oberfläche simpel zusammenzuklicken. Bei NetBeans nennt sich dies "Matisse GUI Builder". Ich bevorzuge jedoch Eclipse, und ich bevorzuge es, meine grafischen Gebilde selbst (im Code) zu errichten. Dann hat man nämlich noch dazu die besten Möglichkeiten, nach dem OOP-Prinzip eigene Komponenten anzufertigen (z. B. einzelne Panels) und in andere Dateien auszulagern.
    Bei komplexen Layouts nehme ich übrigens meist den GridBagLayout-Manager. Der ist zu Beginn zwar schwer zu verstehen, ermöglicht dafür aber später die flexibelsten Layouts.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    1. Hallo Marc,

      Bei NetBeans nennt sich dies "Matisse GUI Builder".

      Der ist übrigens wirklich ziemlich gut, der einzige GUI-Editor, der mich bislang wirklich überzeugt hat. Das verwendete FormLayout ist flexibler als das GridBagLayout und typische Formulare lassen sich sehr bequem zusammenclicken. Das einbinden eigener Komponenten geht auch. Entweder durch Einfügen von eigenem Code oder durch direktes ziehen der Klasse aus der Klassenhierarchie in den GUI-Editor. Dieses Feature habe ich aber noch nicht oft benutzt und es scheint manchmal noch etwas Probleme zu machen.

      Grüße

      Daniel

    2. Hi Marc,

      ich habe jetzt folgende Anwendung gebastelt:
      Ich leite mein Hauptfenstervon JFrame ab und maximiere es mit "setExtendedState".
      Nun erzeuge ich einen Dialog und zeige diesen an:

      DialogTest d = new DialogTest(this);
      d.setVisible(true);

      Diesen Test-Dialog leite ich von JDialog ab und will dort die besagten Eingabefelder und Schaltflächen platzieren:

      public DialogTest(JFrame parent) {
        super(parent, "Test", true);
        getContentPane().setLayout(new BorderLayout());
        addWindowListener(new WindowAdapter() {
          public void windowOpened(WindowEvent e) {
            textField1.requestFocus();
          }

      public void windowClosing(WindowEvent e) {
            setVisible(false);
          }
        });

      pnOben = new JPanel(new GridLayout(21, 1));
        scMain = new JScrollPane(pnOben, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        getContentPane().add(scMain, BorderLayout.NORTH);
        pnUnten = new JPanel(new GridLayout(1, 2));
        getContentPane().add(pnUnten, BorderLayout.SOUTH);

      pnFeld1 = new JPanel(new GridLayout(1, 2));
        label1 = new JLabel("Feld 1:");
        textField1 = new JTextField(10);
        pnFeld1.add(label1);
        pnFeld1.add(textField1);
        pnOben.add(pnFeld1);

      pnFeld2 = new JPanel(new GridLayout(1, 2));
        label2 = new JLabel("Feld 2:");
        textField2 = new JTextField(10);
        pnFeld2.add(label2);
        pnFeld2.add(textField2);
        pnOben.add(pnFeld2);

      ...
      }

      In das untere Panel füge ich einen OK- und einen Abbrechen-Button (JButton) ein.

      Nun habe ich folgendes Problem:
      Das Hauptfenster wird aufgebaut und das Dialogfenster ordnungsgemäß darüber gelegt. Das Dialogfenster ist allerdings riesig - die Eingabefelder auf der rechten Seite werden nicht angezeigt und auch der Abstand zwischen den einzelnen Zeilen ist riesig groß. Auch der Scroll-Balken ist nur zur Hälfte zu erkennen. Die Buttons "OK" und "Abbrechen" im unteren Panel sind ganz verschwunden.
      Wo könnte mein Problem liegen?

      Vielen Dank und viele Grüße,
      Kay