# Button vergrößert sich bei Fenster resize



## javastudent25 (23. Jan 2016)

Hallo zusammen

Ich habe hier mal bei der GUI angefangen etwas zu machen.
Könnte mir jemand sagen, warum mir der Button auf einmal die Grösse des Fensters annimmt, sobald ich es grösser ziehe?
Aufgrund von setBounds(....) sollte es doch auf Position bleiben..


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

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

public class bingo2 extends JFrame{
   
    JFrame fenster;
    JButton button;
   
    bingo2(){
   
    fenster = new JFrame();                  //Als Parameter kann der Text im Titel übergeben werden
    fenster.setSize(300, 500);
    fenster.setLocationRelativeTo(null);    //zentriert das Fenster mittig
    //fenster.setLocation(500.500);         // oder damit kann die Fensterpostion auch 1gesetzt werden
    fenster.setVisible(true);
    fenster.setResizable(true);
    fenster.setTitle("Bingo Button klicken!");
    setLayout(null);
    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
    button = new JButton("Ich heisse Bingo!");
    button.setBounds(10, 10, 150, 25);
    derButtonListener bl = new derButtonListener();
    button.addActionListener(bl);               //oder auch "new derButtonListener" direkt als Parameter
    fenster.add(button);
   

    }
   
    public static void main(String[] args) {
       
        bingo2 bingo = new bingo2();
       
    }
   
    public class derButtonListener implements ActionListener{
       

    public void actionPerformed(ActionEvent e) {
       
        System.out.println("Bingo, ist mein Name!");
       
    }
   
   
    }
}
```


----------



## thecain (23. Jan 2016)

Benutze einen layout manager
Das löst viele Probleme


----------



## javastudent25 (23. Jan 2016)

thecain hat gesagt.:


> Benutze einen layout manager
> Das löst viele Probleme


Hallo thecain

da fehlt mir noch leider das Wissen


----------



## thecain (23. Jan 2016)

Dann eigne es dir an. Keinen layoutmanager zu verwenden führt zu vielen problemen, wenn man nicht genau weiss was man tut


----------



## javastudent25 (23. Jan 2016)

Bin gerade dran, aber vllt. könntest du mir ja schnell meine Frage bzgl. des Containers beantworten.
Das blick ich irgendwie nämlich nicht..
da fängts nämlich an


----------



## 3njoyeD (23. Jan 2016)

Hier ist eine gute Seite, in der viele Layouts beschrieben werden:
http://java-tutorial.org/layout-manager.html


----------



## javastudent25 (23. Jan 2016)

vielen Dank, sehe ich mir gleich an


----------



## javastudent25 (23. Jan 2016)

ok, ich habe jetzt versucht 2 Buttons in der Fläche mittels FlowLayout anzuzeigen. Und damit habe ich also auch mit LayoutManagern gearbeitet. Das Phänomen scheint das Gleiche zu sein.
Ich sehe die Buttons nämlich erst, wenn ich das Fenster aufziehe..


```
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class ZweiButtons {

    JFrame fenster;
    JButton button1;
    JButton button2;

    ZweiButtons() {

        fenster = new JFrame(); // Als Parameter kann der Text im Titel
                                // übergeben werden
        FlowLayout flowLayout = new FlowLayout();
        Container container = fenster.getContentPane();
        container.setLayout(flowLayout);

        fenster.setSize(500, 700);
        fenster.setLocationRelativeTo(null); // zentriert das Fenster mittig
        // fenster.setLocation(500.500); // oder damit kann die Fensterpostion
        // auch 1gesetzt werden
        fenster.setVisible(true);
        fenster.setResizable(true);
        fenster.setTitle("Bingo Button klicken!");

        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button1 = new JButton("Ich heisse Bingo1...");
        button1.setSize(100, 15);
        button2 = new JButton("... und ich heisse Bingo2");
        button2.setSize(100, 15);
        derButtonListener bl = new derButtonListener();
        button1.addActionListener(bl); // oder auch "new derButtonListener"
                                        // direkt als Parameter
        button2.addActionListener(bl);
        container.add(button1);
        container.add(button2);

    }

    public static void main(String[] args) {

        ZweiButtons buttons = new ZweiButtons();

    }

    public class derButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == button1) {

                System.out.println("Ich bin Bingo1!");

            } else {
                if (e.getSource() == button2) {
                    System.out.println("Ich bin Bingo2!");
                }
            }

        }
    }

}
```


----------



## thecain (23. Jan 2016)

Dir fehlt ein repaint


----------



## javastudent25 (23. Jan 2016)

repaint? was meinst du damit?


----------



## javastudent25 (23. Jan 2016)

ich habe mal etwas Neues probiert und weiss nicht, warum meine Texte oben, unten nicht zentriert sind und warum mittig linksbündig steht??


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

import javax.swing.JFrame;
import javax.swing.JLabel;

public class BorderLayouttext extends JFrame{
   
    JLabel textLinks, textRechts, textMittig, textOben, textUnten;
   
    BorderLayouttext(){
       
        textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig");
        textOben = new JLabel("textOben");
        textUnten = new JLabel("textUnten");
       
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(textLinks, BorderLayout.WEST);
        container.add(textRechts, BorderLayout.EAST);
        container.add(textMittig, BorderLayout.CENTER);
        container.add(textOben, BorderLayout.NORTH);
        container.add(textUnten, BorderLayout.SOUTH);
        fenster.setVisible(true);
        fenster.setSize(500, 700);
       
       
    }

    public static void main(String[] args) {

        BorderLayouttext texts = new BorderLayouttext();

    }
   
   

}
```


----------



## thecain (23. Jan 2016)

schau dir doch den aufbau an.

https://docs.oracle.com/javase/8/docs/api/java/awt/BorderLayout.html

bei den anderen Beispielen sehe ich dein Problem nicht, da sehe ich alles sofort. Ansonsten wie geschrieben, manuell ein repaint auslösen.

Zudem würde ich seit Java 8 jedem JavaFX nahelegen, anstatt noch awt und swing zu lernen.


----------



## javastudent25 (24. Jan 2016)

Naja, da muss ich wohl durch. Ich muss nächste Woche eben eine Prüfung schreiben.

Also mit repaint ist nochmals das Fenster neu visible machen gemeint..
gut, aber der obige Aufbau (Beitrag #11) ist total durcheinander trotz BorderLayout

mit den Buttons funktionierts aber?


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Borderlayoutbutton {
JButton buttonLinks, buttonRechts, buttonMittig, buttonOben, buttonUnten;
  
    Borderlayoutbutton(){      
        buttonLinks = new JButton("buttonLinks");
        buttonRechts = new JButton("buttonRechts");
        buttonMittig = new JButton("buttonMittig");
        buttonOben = new JButton("buttonOben");
        buttonUnten = new JButton("buttonUnten");
      
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(buttonLinks, BorderLayout.WEST);
        container.add(buttonRechts, BorderLayout.EAST);
        container.add(buttonMittig, BorderLayout.CENTER);
        container.add(buttonOben, BorderLayout.NORTH);
        container.add(buttonUnten, BorderLayout.SOUTH);
        fenster.setSize(500, 700);
        fenster.setVisible(true);    
    }

    public static void main(String[] args) {
        Borderlayoutbutton texts = new Borderlayoutbutton();
    }
}
```


----------



## thecain (24. Jan 2016)

Ja, weil die buttons standardmässig den ganzen platz einnehmen.

Der Text nicht: Dann nimmt unten/oben die ganze breite ein, text links, da wir ja auch von links nach rechts lesen. Links/Rechts dann soviel platz in der Breite wie nötig, Mitte den Rest.

Mit repaint war https://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#repaint()

gemeint


----------



## Schesam (24. Jan 2016)

Oder einfach setVisible() erst aufrufen, wenn das Frame initialisiert wurde. Das ist sowieso immer ratsam.


----------



## javastudent25 (24. Jan 2016)

Dann müsste dies aber funktionieren, weil das FlowLayout() zentriert doch die JObjekte

damit müssten die Label wohl am definierten Platz sein, aber irgendwie haben die keine Lust heute
Ich seh nämlich textlinks und textrechts nur noch.. die anderen sind wohl schlafen gegangen 


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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BorderLayouttext extends JFrame{ 
    JLabel textLinks, textRechts, textMittig, textOben, textUnten;
 
    BorderLayouttext(){     
        textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig");
        textOben = new JLabel("textOben");
        textUnten = new JLabel("textUnten");
     
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        JPanel panelNorth = new JPanel();
        panelNorth.setLayout(new FlowLayout());
        JPanel panelSouth = new JPanel();
        panelSouth.setLayout(new FlowLayout());
        JPanel panelCenter = new JPanel();
        panelCenter.setLayout(new FlowLayout());
        container.add(textLinks, "West");   //entweder mit "" Position West angeben
        container.add(textRechts, "East");
        container.add(panelCenter, "Center");  // oder mit BorderLayout.CENTER ohne "" - CENTER aber gross
        container.add(panelNorth, BorderLayout.NORTH);
        container.add(panelSouth, BorderLayout.SOUTH);
        fenster.setSize(500, 700);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
    }

    public static void main(String[] args) {
        BorderLayouttext texts = new BorderLayouttext();
    }
}
```


----------



## thecain (24. Jan 2016)

Wie wärs stattdessen mit: https://docs.oracle.com/javase/7/docs/api/javax/swing/JLabel.html#JLabel(java.lang.String, int)

Das horizontale Alingment ist eine `SwingConstants.CENTER`


----------



## javastudent25 (24. Jan 2016)

Das schaut gut aus, aber ich verstehe nicht ganz was ich jetzt damit wirklich anfangen soll.
Das ist ja ein Konstruktor
public JLabel(String text, int horizontalAlignment)
Sorry für die dumme Frage


----------



## thecain (24. Jan 2016)

Vielleicht das JLabel damit initialisieren? Wie wärs?

Dafür das FlowLayout raushauen.


----------



## javastudent25 (24. Jan 2016)

Ich weiss echt nicht was du meinst.
Ich kann ja nicht, wo new FlowLayout() steht, einfach JLabel(String text..., *int* Center) schreiben
erstens passt irgendwie der Ort nicht wo ich es reinquetsche und andererseits stört mich das int..
Ich hab damit einfach zu wenig Erfahrung wie das geht


----------



## javastudent25 (24. Jan 2016)

Ich habe es fast zusammen, ich hatte vergessen, die JLabels zu den Panels hinzuzufügen..
Aber das panelCenter will einfach nicht gecentert werden...
sonst ist alles brav an seinem Platz.


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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BorderLayouttext extends JFrame{
   
    JLabel textLinks, textRechts, textMittig, textOben, textUnten;
   
    BorderLayouttext(){
       
        textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig");
        textOben = new JLabel("textOben");
        textUnten = new JLabel("textUnten");
       
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        JPanel panelNorth = new JPanel();
        panelNorth.add(textOben);
        panelNorth.setLayout(new FlowLayout());
        JPanel panelSouth = new JPanel();
        panelSouth.add(textUnten);
        panelSouth.setLayout(new FlowLayout());
        JPanel panelCenter = new JPanel();
        panelCenter.setLayout(new FlowLayout());
        panelCenter.add(textMittig);
        container.add(textLinks, "West");   //entweder mit "" Position West angeben
        container.add(textRechts, "East");  
        container.add(panelCenter, "Center");  // oder mit BorderLayout.CENTER ohne "" - CENTER aber gross
        container.add(panelNorth, BorderLayout.NORTH);
        container.add(panelSouth, BorderLayout.SOUTH);
        fenster.setSize(500, 700);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
       
       
       
    }

    public static void main(String[] args) {

        BorderLayouttext texts = new BorderLayouttext();

    }
   
   

}
```


----------



## thecain (24. Jan 2016)

```
import javax.swing.*;
import java.awt.*;

/**
* Created by Jan on 23.01.2016.
*/
public class BorderLayouttext extends JFrame {

    JLabel textLinks, textRechts, textMittig, textOben, textUnten;

    BorderLayouttext(){

        textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig", SwingConstants.CENTER);
        textOben = new JLabel("textOben", SwingConstants.CENTER);
        textUnten = new JLabel("textUnten", SwingConstants.CENTER);

        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(textLinks, BorderLayout.WEST);
        container.add(textRechts, BorderLayout.EAST);
        container.add(textMittig, BorderLayout.CENTER);
        container.add(textOben, BorderLayout.NORTH);
        container.add(textUnten, BorderLayout.SOUTH);
        fenster.setVisible(true);
        fenster.setSize(500, 700);


    }

    public static void main(String[] args) {

        BorderLayouttext texts = new BorderLayouttext();

    }
}
```


----------



## javastudent25 (24. Jan 2016)

Hallo thecain
Vielen Dank für deine Hilfe.

Eine grundsätzliche Frage gibt es noch. Deine Variante ist kürzer und auch schöner, aber wo ist bei mir der Denkfehler, warum der Text nicht in die Mitte rutscht.
Es hapert bei den Zeilen wo ich beim funktionierenden Code 3 mal // hinzugefügt habe

Meine Überlegung ist die:

Ich erzeuge ein panelCenter
Ich gebe diesem ein FlowLayout (daher Texte, Buttons etc. werden ja immer zentriert, egal wieviele darin enthalten sind)
und den panelCenter füge ich dann dem BorderLayout.CENTER zu (daher müsste der Text dann genau in der Mitte vom Fenster sein und nicht linksbündig im CENTER oder zentriert oben
Das verstehe ich nicht..

Hier die Codes:
dieser funktioniert:

```
textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig",SwingConstants.CENTER);
        textOben = new JLabel("textOben");
        textUnten = new JLabel("textUnten");
      
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        JPanel panelNorth = new JPanel();
        panelNorth.add(textOben);
        panelNorth.setLayout(new FlowLayout());
        JPanel panelSouth = new JPanel();
        panelSouth.add(textUnten);
        panelSouth.setLayout(new FlowLayout());
        //JPanel panelCenter = new JPanel();
        //panelCenter.setLayout(new FlowLayout());
        //panelCenter.add(textMittig);
        container.add(textLinks, "West");   //entweder mit "" Position West angeben
        container.add(textRechts, "East"); 
        container.add(textMittig, "Center");  // oder mit BorderLayout.CENTER ohne "" - CENTER aber gross
        container.add(panelNorth, BorderLayout.NORTH);
        container.add(panelSouth, BorderLayout.SOUTH);
        fenster.setSize(500, 700);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
```

dieser funktioniert nicht:


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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class BorderLayouttext extends JFrame{
  
    JLabel textLinks, textRechts, textMittig, textOben, textUnten;
  
    BorderLayouttext(){
      
        textLinks = new JLabel("textLinks");
        textRechts = new JLabel("textRechts");
        textMittig = new JLabel("textMittig",SwingConstants.CENTER);
        textOben = new JLabel("textOben");
        textUnten = new JLabel("textUnten");
      
        JFrame fenster = new JFrame();
        Container container = fenster.getContentPane();
        container.setLayout(new BorderLayout());
        JPanel panelNorth = new JPanel();
        panelNorth.add(textOben);
        panelNorth.setLayout(new FlowLayout());
        JPanel panelSouth = new JPanel();
        panelSouth.add(textUnten);
        panelSouth.setLayout(new FlowLayout());
        JPanel panelCenter = new JPanel();
        panelCenter.setLayout(new FlowLayout());
        panelCenter.add(textMittig);
        container.add(textLinks, "West");   //entweder mit "" Position West angeben
        container.add(textRechts, "East"); 
        container.add(panelCenter, "Center");  // oder mit BorderLayout.CENTER ohne "" - CENTER aber gross
        container.add(panelNorth, BorderLayout.NORTH);
        container.add(panelSouth, BorderLayout.SOUTH);
        fenster.setSize(500, 700);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      
      
      
    }

    public static void main(String[] args) {

        BorderLayouttext texts = new BorderLayouttext();

    }
  
  

}
```


----------

