# Swing Größe automatisch anpassen



## LyncH159 (14. Dez 2017)

Hallo!
Ich möchte meine GUI bzw. mein Swing automatisch der Größe meines Bildschirms anpassen. 

```
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
```
Bei setExtendedState ist mein JFrame leider nur oben links in der Ecke und nicht über den gesamten Bildschirm.


----------



## truesoul (14. Dez 2017)

Hallo.

Also eigentlich sollte es funktionieren.

Beispiel:


```
JFrame frame = new JFrame("FrameDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.pack();

frame.setVisible(true);
```

Vielleicht hast du ein wenig Code?

Ansonsten: https://docs.oracle.com/javase/tutorial/extra/fullscreen/index.html

Oder damit: 


```
JFrame frame = new JFrame("FrameDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
// frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
System.out.println(xSize);
frame.setPreferredSize(new Dimension(xSize, ySize));

frame.pack();

frame.setVisible(true);
```


----------



## LyncH159 (14. Dez 2017)

Mein Code JFrame Code


```
frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);


        frame.setVisible(true);
```

Habe das soweit eingefügt dein Vorschlag, aber es ist immer noch oben Links klein gerendert. Es kommt zwar im Vollbild aber wie gesagt nur oben rechts!


----------



## truesoul (14. Dez 2017)

LyncH159 hat gesagt.:


> Mein Code JFrame Code
> 
> 
> ```
> ...



Wo ist denn: setExtendedState in dem Code?


----------



## LyncH159 (14. Dez 2017)

```
frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
```


----------



## truesoul (14. Dez 2017)

Also für mich sieht es aus, dass der Frame in der Vollansicht ist, nur der Panel nicht voll dargestellt wird.


----------



## LyncH159 (14. Dez 2017)

Wie kann ich das Panel denn auf die Vollansicht umstellen?


----------



## truesoul (14. Dez 2017)

Ja mach mal das frame.getContentPane().setLayout(null); weg. Dann sollte es funktionieren. Aber du hast noch immer nicht dein Code gezeigt, falls es nicht klappen sollte.


----------



## LyncH159 (14. Dez 2017)

```
public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Startansicht window = new Startansicht();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Startansicht() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
       
        textField_1 = new JPasswordField();
        textField_1.setBounds(306, 216, 280, 32);
        textField_1.setOpaque(false);
        textField_1.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        frame.getContentPane().add(textField_1);
        textField_1.setColumns(10);
       
        textField = new JTextField();
        textField.setColumns(10);
        textField.setOpaque(false);
        textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        textField.setBounds(306, 113, 280, 32);
        frame.getContentPane().add(textField);
       
        JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Fabio\\Desktop\\GUIII.png"));
        lblNewLabel.setBounds(0, 0, 279, 503);
        frame.getContentPane().add(lblNewLabel);
       
        JLabel lblNewLabel_1 = new JLabel("X");
        lblNewLabel_1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.exit(0);               
            }
        });
        lblNewLabel_1.setForeground(Color.RED);
        lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 18));
        lblNewLabel_1.setBounds(616, 0, 18, 22);
        frame.getContentPane().add(lblNewLabel_1);
       
        JButton btnNewButton = new JButton("Einloggen");
        btnNewButton.setBackground(SystemColor.textHighlight);
        btnNewButton.setForeground(new Color(47, 79, 79));
        btnNewButton.setBounds(300, 350, 105, 37);
        frame.getContentPane().add(btnNewButton);
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if(textField_1.getText().isEmpty() == true && textField.getText().isEmpty() == true) {
                        JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihren Spielernamen und Ihr Passwort ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);   

                }
                else if(textField_1.getText().isEmpty() == true) {   
                    JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihr Passwort ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);
                }
                else if(textField_1.getText().isEmpty() == true){       
                    JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihren Spielernamen ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);       
               
                }
                    else{
                    str = textField.getText();
                    new DesignNew();
                    frame.dispose();}
   
                }});
       
        JButton btnRegistrieren = new JButton("Registrieren");
        btnRegistrieren.setForeground(new Color(178, 34, 34));
        btnRegistrieren.setBackground(SystemColor.textHighlight);
        btnRegistrieren.setBounds(434, 350, 105, 37);
        frame.getContentPane().add(btnRegistrieren);
        btnRegistrieren.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                frame.dispose();
                }
            });
       
       
        JLabel lblAlsGastFortfahren = new JLabel("Als Gast fortfahren...");
        lblAlsGastFortfahren.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                frame.dispose();
            }
        });
        lblAlsGastFortfahren.setFont(new Font("Tahoma", Font.BOLD, 11));
        lblAlsGastFortfahren.setForeground(Color.BLUE);
        lblAlsGastFortfahren.setBounds(368, 419, 119, 14);
        frame.getContentPane().add(lblAlsGastFortfahren);
       
        JLabel lblSpielername = new JLabel("SPIELERNAME");
        lblSpielername.setBounds(300, 92, 105, 14);
        frame.getContentPane().add(lblSpielername);
       
        JLabel lblPasswort = new JLabel("PASSWORT");
        lblPasswort.setBounds(300, 191, 105, 14);
        frame.getContentPane().add(lblPasswort);
       
        JLabel ZiehLabel = new JLabel();
        ZiehLabel.setBackground(SystemColor.control);
        ZiehLabel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                pX = e.getX();
                pY = e.getY();
            }
        });
        ZiehLabel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                frame.setLocation(frame.getLocation().x + e.getX() - pX,
                frame.getLocation().y + e.getY() - pY);
            }
        });
        ZiehLabel.setBounds(0, 0, 634, 503);
        frame.getContentPane().add(ZiehLabel);
       
        JSeparator separator = new JSeparator();
        separator.setForeground(new Color(255, 255, 255));
        separator.setBackground(new Color(255, 255, 255));
        separator.setBounds(300, 143, 290, 2);
        frame.getContentPane().add(separator);
       
        JSeparator separator_1 = new JSeparator();
        separator_1.setForeground(Color.WHITE);
        separator_1.setBackground(Color.WHITE);
        separator_1.setBounds(300, 246, 290, 2);
        frame.getContentPane().add(separator_1);
        frame.setVisible(true);

    }
```


Habe frame.getContentPane().setLayout(null); entfernt, funktioniert leider nicht !


----------



## truesoul (14. Dez 2017)

Also du verwendest kein Layout und das solltest du ändern:
https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Du fügst alle Komponenten dem JFrame hinzu, besser du fügst es ein JPanel hinzu, und diesem dann dem JFrame.

Und wenn du kein Layout haben willst, dann müssen die setBounds natürlich korrekt sein.

Also Beispiel:


```
// 616 ist Horizontal
// 0 ist Vertical
lblNewLabel_1.setBounds(616, 0, 18, 22);

// Bei einer Auflösung von 1920x1080 müsste dann was stehen?
```

EDIT: Du könntest natürlich Code verwendet den ich als Beispiel hier gepostet habe.


----------



## LyncH159 (14. Dez 2017)

truesoul hat gesagt.:


> Also du verwendest kein Layout und das solltest du ändern:
> https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
> 
> Du fügst alle Komponenten dem JFrame hinzu, besser du fügst es ein JPanel hinzu, und diesem dann dem JFrame.
> ...



Ein neues Layout festzusetzen, wird wahrscheinlich mit Stundenlanger Arbeit verbunden sein. Ich habe schon mehrere Klassen erstellt und deshalb muss ich auf eine Alternative zurückgreifen. 
Also müsste ich es immer bei setBounds manuell anpassen?


----------



## truesoul (14. Dez 2017)

LyncH159 hat gesagt.:


> Also müsste ich es immer bei setBounds manuell anpassen?



Nein müsstest du nicht, aber anhand der Auflösung müsste für jedes Element die richtige Position gesetzt sein. 
Verwenden kannst du z. B Toolkit.getDefaultToolkit(). 

Ich nehme mal an das Kreuz soll oben rechts sein? Bei einer Auflösung von 1920X1080 müsste dann setBounds(width-20, 0, 18, 22) lauten. 

Usw.


----------



## LyncH159 (14. Dez 2017)

truesoul hat gesagt.:


> Nein müsstest du nicht, aber anhand der Auflösung müsste für jedes Element die richtige Position gesetzt sein.
> Verwenden kannst du z. B Toolkit.getDefaultToolkit().
> 
> Ich nehme mal an das Kreuz soll oben rechts sein? Bei einer Auflösung von 1920X1080 müsste dann setBounds(width-20, 0, 18, 22) lauten.
> ...


Ich kann dir da nicht richtig folgen.

```
frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(20, 0, 18, 22);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
```

habe es jetzt so übernommen und jetzt sehe ich das JFrame garnicht mehr


----------



## truesoul (14. Dez 2017)

Für dein X zum Beispiel:


```
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
.....
// Bei einer Auflösung von 1920 x 1080 wäre dann xSize 1900
lblNewLabel_1.setBounds(xSize - 20, 0, 18, 22);
```

So jetzt sollte das X rechts oben sein. Und du willst sicher deine Textfelder zentriert haben?
Dann musst du anhand xSize und ySize die richtige Position errechnen. Dabei solltest du die Größe jedes Elements beachten.


----------



## Neumi5694 (16. Dez 2017)

Du machst dir das aber auch unnötig kompliziert ...
Layoutmanager zu verwenden, ist das erste, das man mit Swing lernen sollte.
Dem Frame Komponenten hinzuzufügen macht deinen Code sehr starr. Besser ist wirklich, ein Panel als Komponente zu verwenden und dieses Panel dann dem Frame hinzuzufügen.
Damit es automatisch auf die Größe des Frame skaliert, verwendest du für die Content-Pane des Frames ein BorderLayout und fügst das Panel mit der Eigenschaft CENTER hinzu. Dann musst du gar nichts manuell machen.


----------

