# JFrame-Größe an inneren Container anpassen



## kwonilchang (16. Feb 2010)

Hallo,

beim Start meiner GUI soll nur ein leeres Fenster mit der Menüleiste angezeigt werden. Öffnet man dann via JFileChooser ein Dokument, soll dieses dann ebenfalls angezeigt werden. Soweit geht das auch alles. Mein Problem ist jedoch, dass sich der JFrame nicht an das JPanel anpasst, dass die eingelesene Datei darstellt.


```
class SudokuMainFrame extends JFrame {
public SudokuMainFrame() {
        super("SudokuGUI");
        this.setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        
        JMenuBar menuBar = createMenuBar();
        mainFrameContent = this.getContentPane();
        mainFrameContent.setLayout(new BorderLayout());
        
        mainFrameContent.add(menuBar, BorderLayout.NORTH);
        sudokuBoard = new JPanel();
        mainFrameContent.add(sudokuBoard, BorderLayout.CENTER);
        
        this.pack();
        this.setVisible(true);
    }

   ...

   void createGamefield() {
        sudokuBoard.removeAll();
        sudokuBoard.setLayout(new GridLayout(model.getDim(), model.getDim()));
        
        for (int i = 0; i < model.getDim(); i++) {
            for (int j = 0; j < model.getDim(); j++) {
                JLabel label = new JLabel();
                label.setPreferredSize(new Dimension(40, 40));
                label.setVisible(true);
             
                sudokuBoard.add(label);
            }
        }
        this.pack();
        this.setVisible(true);
    }
}
```

Hab versucht, statt mit preferredSize mit minimumSize zu arbeiten; in diesem Fall funktioniert die Größenanpassung, aber die Größe beim Programmstart geht verloren. Was muss ich ändern, damit die Größenanpassung klappt?

Danke schonmal!


----------



## Michael... (17. Feb 2010)

kwonilchang hat gesagt.:


> ```
> this.setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
> ```


Du möchtest, dass das Fenster zu Beginn die oben gesetzte Größe hat
und nach dem Einfügen der Labels die Größe entsprechend anpasst?

Damit später die Größe an den Platzbedarf der Labels angepasst wird, nicht die PreferedSize setzen, sondern nur mit setSize() die aktuelle Größe setzen.
Damit das Fenster auch mit der so gesetzten Größe angezeigt wird darfst im Konstrukor nicht this.pack(); aufgerufen werden.

Noch ein paar Hinweise:
JFrame besitzt standardmäßig ein BorderLayout - muss also nicht explizit nochmals gesetzt werden. Ausserdem besitzt JFrame eine Methode setJMenuBar(...) mit normalerweise die JMenuBar eingefügt wird.


----------



## kwonilchang (17. Feb 2010)

Danke, habs gleich ausprobiert. Klappt wunderbar. Es dauert jetzt zwar ein bisschen, bis das Spielfeld angezeigt wird, aber die Größenanpassung läuft.


----------

