# JFrame Größe ändern



## MaxG. (14. Dez 2016)

Hi,
ich habe ein Programm bei dem JFrame Vollbild hat. Nun Möchte ich den Frame zur Laufzeitumgebung mit einem MenuItem auf 600x400 setzen. Mit frame.setSize(600,400) habe ich es schon probiert, hat aber nicht funktioniert. 
Weis jemand wie das geht??


----------



## Robat (14. Dez 2016)

Wie setzt du das JFrame denn auf Fullscreen?
`JFrame#setExtendendState(JFrame.MAXIMIZE_BOTH);`?
`JFrame#setSize(x, y);`?

Bisschen Code wäre schön


----------



## MaxG. (14. Dez 2016)

```
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setUndecorated(true);
this.setVisible(true);
```


----------



## Robat (14. Dez 2016)

Und der Code wo du versuchst die Größe zu ändern?
Muss man dir das alles aus der Nase ziehen?


----------



## VfL_Freak (14. Dez 2016)

Moin,


MaxG. hat gesagt.:


> Mit frame.setSize(600,400) habe ich es schon probiert, hat aber nicht funktioniert.


ich fürchte, dass es deswegen nicht drin ist ..... 

Gruß Klaus


----------



## MaxG. (14. Dez 2016)

```
package Core;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import Gui.MainFrame;

public class Listener{

    MainFrame frame;
  
    public Listener(MainFrame frame){
        this.frame = frame;
    }
  
    public void getAction(){
      
        frame.schließen.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
              
            }
        });
      
      
        frame.size.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {

                frame.setSize(600,400);
            }
        });

    }
}
```


----------



## VfL_Freak (14. Dez 2016)

MaxG. hat gesagt.:


> MainFrame frame;
> 
> *public* Listener(MainFrame frame){
> *this*.frame = frame;
> }


BTW: ein bisschen viel 'frame', gell??
Benenne erstmal Dein Variablen eindeutiger

Kommt nach  dem "setSize" auch noch irgendwo ein Neuzeichnen ?


----------



## Robat (14. Dez 2016)

Theoretisch brauchst du `repaint();` nicht mal aufzurufen wenn es um die Größe des Frames geht.
Ich würde ja einfach mal raten und sagen, dass er nirgends getAction() aufruft


----------



## MaxG. (14. Dez 2016)

```
package Anzeige;


import Core.Listener;
import Gui.MainFrame;

public class RunProgramm {

    public static void main(String[] args) {

       
        MainFrame frame = new MainFrame();
        frame.showGuiFullsize();

        Listener listener = new Listener(frame);
        listener.getAction();
    }

}
```


----------



## MaxG. (14. Dez 2016)

```
package Gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MainFrame extends JFrame{

    public JPanel liste;
    public JPanel Containerliste;
   
   
    public JPanel buttons;
    public JPanel buttonContainer;
   
    public JMenuBar menuBar;
    public JMenu menu;
    public JMenuItem schließen;
    public JMenuItem size;
   
    public JButton antenneBayern;
    public JButton radioGalaxy;
    public JButton bayern3;
   
    public JButton pause;
    public JButton play;
    public JButton mute;
   
    public MainFrame(){
       
        this.setLayout(new BorderLayout());
       
       
        menuBar = new JMenuBar();
        menu = new JMenu("Datei");
        schließen = new JMenuItem("Schließen");
        size = new JMenuItem("Minimiren");
        menu.add(schließen);
        menu.add(size);
        menuBar.add(menu);
       
       
        Containerliste = new JPanel();
       
        liste = new JPanel();
        liste.setLayout(new GridLayout(5,1,3,3));
       
        antenneBayern = new JButton("Antenne Bayern");
        radioGalaxy = new JButton("Radio Galaxy");
        bayern3 = new JButton("Bayern 3");
       
        liste.add(antenneBayern);
        liste.add(radioGalaxy);
        liste.add(bayern3);
       
        Containerliste.add(liste);
       
       
        buttonContainer = new JPanel();
        buttons = new JPanel();
        buttons.setLayout(new GridLayout(1,5,5,5));
       
        play = new JButton();
        play.setIcon(new ImageIcon("C:/Users/grohmann/workspace/RaspberryPiInternetRadioTest/src/Icons/play-icon.png"));
        pause = new JButton();
        pause.setIcon(new ImageIcon("C:/Users/grohmann/workspace/RaspberryPiInternetRadioTest/src/Icons/pause-icon.png"));
        mute = new JButton();
        mute.setIcon(new ImageIcon("C:/Users/grohmann/workspace/RaspberryPiInternetRadioTest/src/Icons/audio-off-icon.png"));
       
        buttons.add(play);
        buttons.add(pause);
        buttons.add(mute);
       
        buttonContainer.add(play);
        buttonContainer.add(mute);
        buttonContainer.add(pause);
       
        this.add(menuBar,BorderLayout.NORTH);
        this.add(Containerliste,BorderLayout.WEST);
        this.add(buttonContainer,BorderLayout.SOUTH);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
       
    }
   
   
    public void showGuiFullsize(){
        this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
        this.setUndecorated(true);
        this.setVisible(true);
       
    }
   
    public void showGui(){
        this.setSize(300,200);
        //this.setVisible(true);
    }
   
}
```


----------



## Robat (14. Dez 2016)

Und wo ist jetzt das Problem? Das Programm funktioniert doch


----------



## MaxG. (15. Dez 2016)

Wenn ich aber auf das MenuItem drücke passiert nichts.


----------



## Robat (15. Dez 2016)

Bekommst du denn eine Fehlermeldung?

Hab mir das Projekte gerade mal herauskopiert und bei mir funktioniert es. Das Fenster wird verkleinert auf 600x400.
Es ist zwar nicht schön weil es oben links in der Ecke klebt und undecorated ist aber mehr macht der Code nun mal nicht 

Du könntest noch mal versuchen `JFrame#repaint()` aufzurufen nachdem du die Größe verändert hast

Gruß
Robert


----------



## MaxG. (15. Dez 2016)

Ich habs jetzt hinbekommen. Hatte einen Fehler beim Aufrufen des MainFrame. 

Danke für eure Hilfe.


----------



## Robat (15. Dez 2016)

MaxG. hat gesagt.:


> Ich habs jetzt hinbekommen. Hatte einen Fehler beim Aufrufen des MainFrame.


Dann poste mal bitte, was du jetzt gemacht hast. Wenn andere vllt. auf das selbe Problem stoßen haben sie einen Ansatz.

Danke


----------



## MaxG. (15. Dez 2016)

Der Code hat sich noch leicht verändert.
Es gibt jetzt noch eine boolesche Variable, die den zustand des Frames speichert. True = Vollbild, 
False = 500 X 250.

Der Code sieht mitlerweile so aus:


```
package Core;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

import Gui.MainFrame;

public class Listener{

    MainFrame frame;
    boolean frameStatus = true;
  
    public Listener(MainFrame frame){
        this.frame = frame;
    }
  
    public void getAction(){
      
        frame.schließen.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
              
            }
        });
      
      
        frame.menuItemSize.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
              
                if(frameStatus == true){
                    frame.setSize(500,250);
                    frameStatus = false;
                    frame.menuItemSize.setText("Maximiren");
                }else{
                    frame.menuItemSize.setText("Minimieren");
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                    frameStatus = true;
                  
                }
              
            }
        });
      
      
        frame.antenneBayern.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
              
              
            }
        });
      
      
        frame.menuItemExit.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
              
            }
        });
      
      
    }
}
```


----------



## Joose (15. Dez 2016)

Kleiner Tipp am Rande:
In der if-Bedingung kannst du dir das `== true` sparen. Grund: die if-Bedingung erwartet einen boolschen Ausdruck. "frameStatus" selbst ist schon so ein Ausdruck.
Mit "== true" würdest du nur zusätzlich prüfen ob er true ist.

Und das "umdrehen" des boolean kannst du einfacher machen 


```
if(frameStatus) {
   frame.menuItemSize.setText("Maximiren");
   frame.setSize(500,250);
} else {
   frame.menuItemSize.setText("Minimieren");
   frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
frameStatus = !frameStatus;
```


----------

