# Anwendung im Vollbild zentrieren



## Vivyel (14. Aug 2015)

Hallo zusammen,

ich würde gerne wissen wie ich meine GUI im Vollbildmodus(nicht im fenster) zentrieren kann. Weder Youtube, google, noch dieses Forum  enthielten eine Lösung. 

Zusätzliche infos:
Ich verwende ein JFrame mit dem layout absolute im windowbuilder. Im Fenster hab ich die Andwendung schön mittig positionieren können, aber im Vollbildmodus befindet sie sich immer im linken oberen Bildschirmrand.

Ich weis leider nicht wie ich sie zentrieren kann, bitte helft mir. 

Liebe Grüße

Vivyel


----------



## VfL_Freak (14. Aug 2015)

Moin,

verstehe offen gestanden Deine Frage nicht !

"Vollbildmodus" bedeutet doch, dass das Anwendung über den gesamten Bildschirm geht ....
Was sollte denn da noch zentriert werden ?

Poste ggf. mal entsprechende Bildschirmfotos zu Verdeutlichung, was Du genau meinst !

Gruß Klaus


----------



## RalleYTN (14. Aug 2015)

Allgemeine Formel zum zentrieren von Inhalt INNERHALB einer Anwendung:


```
int x = (int)((frame.getWidth() - content.getWidth()) * 0.5F);
int y = (int)((frame.getHeight() - content.getHeight()) * 0.5F);
```

Und ein kleiner Tipp: Hau den Windowbuilder in die Tonne und schreib den Code selber, da hast du mehr Freiheiten und dazu gibt es viele viele YouTube Tutorials(auch auf Deutsch).


----------



## Schmetterhand (14. Aug 2015)

Bei mir funktioniert das Zentrieren des Fensters es mit Swing ungefähr so (unabhängig vom Vollbild):


```
private static Point gibMonitormitte(final Dimension fenstergröße)
  {
  Dimension monitor = Toolkit.getDefaultToolkit().getScreenSize();

  int eckx = ( monitor.width  - fenstergröße.width  ) / 2;
  int ecky = ( monitor.height - fenstergröße.height ) / 2;
  Point ecke = new Point( eckx, ecky );

  return ecke;
  }
```


----------



## RalleYTN (14. Aug 2015)

Schmetterhand hat gesagt.:


> Bei mir funktioniert das Zentrieren des Fensters es mit Swing ungefähr so (unabhängig vom Vollbild):
> 
> 
> ```
> ...


für ein JFrame ist es aber immer noch am einfachsten die Methode setLocationRelativTo(Component) aufzurufen. man gebe als Parameter "null" und das Fenster ist mittig. Durch nur eine Zeile Code.


----------



## Vivyel (14. Aug 2015)

*@RalleYTN,* ich habe deine Formel in meine public class kopiert, jedoch funktionieren die getter nicht bei mir. ich habe anschließden das frame durch ein JFrame ersetzt und das content zu  ContentPane geändert, was leider auch nicht funktioniert hat. Oder mach ich was falsch in der variablen deklaration?
ich benutze den builder nur um mir die oberfläche zu designen, als auch für das automatiche erstellen von event handlern, in die ich meine methoden selbst schreibe. mir persönlich ist es auch schon mit xaml viel leichter gefallen, erst die oberfläche optisch zu gestalten und dann die logik mit c# dahinter zu schreiben.(mir persönlich fällt java schwerer als c#u.a. auch wegen der syntax )

*@Schmetterhand,* ich habe deine klasse 1:1 in meinen code übernommen, das toolkit importiert, jedoch wird die anwenung im maximierten fenster wieder nicht zentriert.

*Darstellung des Problems:*
im bild minifenster ist die anwendung schön mittig. aber sobald ich das fenster maximiere (sie png maximiert) wird die anwenung ins linke obere eck des bildschirms geschoben, anstatt mittig zu bleiben.

*Was ist meine Anwendung?*
meine anwendung generiert eine random additionsaufgabe die der anwender lösen soll. man kann die tastatur verwenden oder auf die buttons klicken. wenn die aufgabe richtig gelöst wurde generiert er automatisch die nächste. 

vielen dank für eure antworten


----------



## RalleYTN (14. Aug 2015)

Vivyel hat gesagt.:


> *@RalleYTN,* ich habe deine Formel in meine public class kopiert, jedoch funktionieren die getter nicht bei mir. ich habe anschließden das frame durch ein JFrame ersetzt und das content zu  ContentPane geändert, was leider auch nicht funktioniert hat. Oder mach ich was falsch in der variablen deklaration?


Ich habe eine bessere Lösung gefunden. .......hast ja schließlich auch mal Bilder gezeigt.
1. Packe alle deine Komponenten abgesehen von den Containern in einen neuen Container.
2. Mache noch einen Container und setze das Layout auf BorderLayout mit
	
	
	
	





```
container2.setLayout(new BorderLayout());
```
3. Adde den Container mit den Komponenten in den Container mit den BorderLayout und setze ihn in die zentrale Position des BorderLayouts mit
	
	
	
	





```
container2.add(container1, BorderLayout.CENTER);
```
4. setze den Container mit dem BorderLayout als ContentPane für deine JFrame
5. PROBLEM GELÖST!


----------



## Schmetterhand (14. Aug 2015)

@Vivyel
Ich dachte, du meinst ein Fenster, welches zentriert werden soll! (Du hast immer von einer "Anwendung, die zentriert werden soll" gesprochen) Nun ist es aber nur eine Panele, die in einem Fenster zentriert werden soll.
Die Lösung von RallyeYTN ist zwar gut, aber wenn du Netbeans als graphischen GUI-Designer benutzt, geht das alles noch per Klicki-Klicki.


----------



## RalleYTN (14. Aug 2015)

Schmetterhand hat gesagt.:


> @Vivyel
> Die Lösung von RallyeYTN ist zwar gut, aber wenn du Netbeans als graphischen GUI-Designer benutzt, geht das alles noch per Klicki-Klicki.


Ich hasse GUI Builder Software für Java.


----------



## Vivyel (14. Aug 2015)

@RalleYTN vielen dank für diese Lösung. Leider hänge ich gerade bei 4. ich weiß nicht was ich im code verändern muss damit container2 als contentpane für mein jframe verwendet wird.

ich hab deine schritte in einer testklasse ausgeführt und dort folgende hierarchie (siehe bild) und code (siehe code)
das contentpane hat das layout absolut, container1 ebenfalls und container2 hab ich wie du gesagt hast auf borderlayout gestellt.

tut mir leid, ich stell mich echt blöd an
eigentlich müsste ich sowas beherrschen, leider verstand ich nie was in unseren java gui vorlesungen.(der prof konnte überhaupt nix verständlich erklären). Jetzt versuch ich mir alles in den Ferien selbst bei zu bringen, um meinen kommilitonen nächstes semester im softwareprojekt eine Hilfe zu sein.


----------



## RalleYTN (14. Aug 2015)

Hier ist mal ein Beispiel Code:

```
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class AnwendungImVollbildmodusZentrieren {

   public static void main(String[] args) {
     
     // erstellt ContentPane
     Container contentPane = new Container();
     contentPane.setLayout(new BorderLayout());
     
     // erstellt Container
     Container components = new Container();
     components.setLayout(new FlowLayout());
     
     // erstellt Buton
     JButton button = new JButton("Ich bin ein Button!");
     
     // erstellt Textfeld
     JTextField textField = new JTextField("Hier steht Text");
     
     // Fügt Komponenten in Container ein
     components.add(button);
     components.add(textField);
     
     // Fügt Container in ContentPane ein
     contentPane.add(components, BorderLayout.CENTER);
     
     //erstellt JFrame
     JFrame frame = new JFrame("Anwendung im Vollbildmodus zentrieren");
     frame.setSize(640, 480);
     frame.setLocationRelativeTo(null);
     frame.setResizable(true);
     frame.setMinimumSize(new Dimension(640, 480));
     frame.setContentPane(contentPane); // setzt ContentPane
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setVisible(true);
   }
}
```
Und wenn du mit Java nicht so gut klarkommst dann empfehle ich diese Playlist:


----------



## Vivyel (14. Aug 2015)

ich hab deine klasse mal getestet, dabei ist mir aufgefallen, dass du als content pane genau wie ich das absolute layout verwendest. jedoch im nächsten container hast du das layout auf flow verändert, womit der inhalt des panels oben mittig des bildschirms und positioniert wird.

ich habe das flowlayout testweise über meinen container gelegt. der inhalt wird zwar mittig, dafür kann ich nicht mehr die position der elemente bestimmen und alles wird waagerecht an den oberen bildschirmrand geklebt, mein komplettes design ist damit zerstört. 
es muss noch eine andere möglichkeit geben dies mit einem absoluten layout um zu setzen. 
kann man das standard content pane im windows build editor i-wie manipulieren, damit es den maximierten zustand anzeigt?




Anmerkung:
an unserer fh hat unser prof das jframe immer über (public class nameklasse extends JFrame) implementiert. deine methode hat er in der form nie angewandt. wir haben in der main nur das set visible für public class gesetzt damit die elemente beim abspielen auch angezeigt werden.
ich hab mir vorhin unseren workspace angeschaut und keine "methode" gefunden die den inhalt mittig setzt.

meine größten probleme liegen eigentlich mehr in der syntax. (das liegt vermutlich auch daran, dass ich das letzte semester fast täglich an meiner windows app mit xaml und c# gearbeitet habe - dafür gabs dann auch eine 1. und java ziemlich vernachlässigt hab)


----------



## RalleYTN (14. Aug 2015)

Du kannst die Position sehr wohl bestimmen, allerdings musst du ein paar mehr Layouts und Container verwenden und das ganze verschachteln...... oder du schreibst deinen eigenen LayoutManager. das erste erfordert Grundlegende Kenntnisse zu AWT und Swing und das zweite fortgeschrittene. Ich habe einfach ein neues JFrame Objekt erzeugt während du ein eigenes definierst. Das ist dann wieder Grundwissen zur Objektorientierung in Java. Ih empfehle dir wirklich alle Videos der Playlist einmal anzusehen.


----------



## YesTerDay2810 (13. Apr 2016)

Ich habe mal ein bisschen recherchiert. Das ist eigentlich ganz einfach 


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

Das wichtige ist die Code Zeile: frame.setLocationRelativeTo(null); Diese sollte deinen Frame mittig auf dem Bildschirm platzieren. Bei mir hat dies zumindest funktioniert!

Gruß
Yester


----------

