# Java-Frame mit Hintergrundbild und Button



## ekisback67 (14. August 2018)

Hey 

ich bin neu im Forum und in der Java-Programmierung und auf ein Problem gestoßen, wobei ich hoffe, dass ihr mir weiterhelfen könnt.

Und zwar möchte ich meinem JFrame ein Hintergrundbild verpassen, auf diesem dann ein Button platzfinden soll.

Mit ein wenig Hilfe habe ich das sogar schon geschafft, nur habe ich das Problem, dass ich zwar die Größe des Buttons ändern kann, aber nicht dessen Position...

Außerdem lässt dich die Größe des Buttons nur mit dem Befehl setPreferredSize(new Dimension(x,y))) ändern, nicht aber mit setSize().

Habt ihr eine Idee wieso? :/

Mein Code:


```
public class Gui extends JFrame
{   
    
    private BedienPanelOben bedienPanelOben;
    
    private Image hBild;
    
    private JButton powerButt = new JButton();

    public static void main()
    {
        Gui myGui = new Gui();
    }

    public Gui()
    {
        super("Programm");
        
        setLayout(null);
        
        initialisieren();
        
        bedienPanelOben = new BedienPanelOben();

        bedienPanelOben.powerButt.setPreferredSize(new Dimension(35,25));       
        //bedienPanelOben.powerButt.setSize(50,50);
        bedienPanelOben.powerButt.setLocation(50,50);
        
        add(bedienPanelOben.powerButt);

        setBounds(500,300,1040,490);
        
        setVisible(true);
        
    }
    
    private void initialisieren()
    {
        setContentPane(new JPanel()
        {
            {
                hBild = getToolkit().createImage("bild.jpg");
                MediaTracker mt = new MediaTracker(this);
                mt.addImage(hBild, 1);
                try
                {
                    mt.waitForAll();
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            
            @Override
            protected void paintComponent(Graphics g)
            {
                g.drawImage(hBild, 0, 0, this);
            }
        });
    }
}
```

Grüße


----------



## HonniCilest (14. August 2018)

Was ist denn BedienPanelOben?


----------



## ekisback67 (14. August 2018)

Hey 

BedienPanelOben ist eine Klasse, in der ich alle meine Buttons implementieren wollte:


```
public class BedienPanelOben extends JPanel
{
   public JButton powerButt = new JButton();
  
   public BedienPanelOben()
   {
      //powerButt.setBounds(540,50,350,250);
      
      powerButt.setBackground(Color.RED);
      //powerButt.setPreferredSize(new Dimension(35,25));

   }
}
```


----------



## Bratkartoffel (15. August 2018)

Hi,

dass du mit setPreferredSize() und nicht mit setSize() arbeiten musst ist eine der etwas komisch anmutenden Eigenschaften von Swing.
Wenn du neu in Java bist, dann verwende bitte gleich JavaFX. Swing ist tot, JavaFX ist der Nachfolger. Ist auch einfacher zu verwenden (du kannst z.b. die Oberflächen auch per Designer erstellen: https://gluonhq.com/products/scene-builder/)

Zu Swing: Panels sind standardmässig transparent, sprich ein setBackground() zeigt keine Wirkung. Du musst es erst per setOpaque(false) undurchsichtig machen.

Grüsse,
BK


----------



## ekisback67 (16. August 2018)

Hi Bratkartoffel,

vielen Dank für den Hinweis. Ich werde mich mit JavaFX mal auseinandersetzen.

Aber kannst du mir sagen, warum ich die Position meines Buttons nicht verändern kann, dessen Größe aber schon?

Grüße


----------



## Bratkartoffel (16. August 2018)

Hi,

die Position und Grösse der Komponenten wird bei Swing von den LayoutManagern definiert. (Deshalb auch setPreferredSize != setSize). Hier gibt es z.B. das FlowLayout, BorderLayout, GridLayout.

Eine kleine Einleitung hierzu findest du z.B. hier: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Grüsse,
BK


----------



## ekisback67 (16. August 2018)

Hey,

danke für Deine schnelle Antwort. 

in meinem Code habe ich den LayoutManager mit 


```
setLayout(null);
```

deaktiviert, oder nicht? Deswegen wundere ich mich, das ich setPreferredSize verwenden muss und nicht setSize..


Grüße


----------



## Bratkartoffel (16. August 2018)

Hi,

jein, deaktiviert nicht direkt. Du nutzt nur einen impliziten LayoutManager (soweit ich weiss).
Details hierzu auch hier: https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

Warum hier das setSize() nicht greift? Keine Ahnung, ich habs einfach als (weitere) Eigenheit von Swing abgestempelt 

Grüsse,
BK


----------



## ekisback67 (20. August 2018)

Vielen Dank 

Jetzt habe ich aber noch das Problem, warum ich die Position des Buttons nicht verändern kann. 

Hast du da auch eine Idee?


Grüße


----------



## Bratkartoffel (21. August 2018)

Hi,

Ich vermute, dass du dein Panel per setLocation() platzieren musst, nicht den Button innerhalb des Panels. Das Panel selbst ist meines Wissens nach nur so gross, wie die Komponenten innerhalb.
Da dein Panel also nur so gross wie der Button ist, ignoriert er die Location von diesem.

Grüsse,
BK


----------

