JFrame mit Hintergrundbild und Button

Strooobel

Mitglied
Hey upload_2018-8-16_15-13-19.gif

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 und wie ich das lösen könnte? :/

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();

        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);
            }
        });
    }
}

und meine Klasse "BedienPanelOben", in der ich meine Ganzen Buttons implementieren wollte:

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

     bedienPanelOben.powerButt.setLocation(50,50);

   }
}

Vielen Dank im Voraus 🙂

Grüße

Strooobel
 
Hey 🙂
Heißt das, ich muss das JPanel mittels setLayout(null) auf null setzen?
Und wenn ja, wie genau mache ich das?

Sry, bin neu in Java 🙁

Grüße
 
In AWT/Swing gibt es sog. Container, die andere Komponenten aufnehmen können. Dazu zählt zum Beispiel JPanel. Normalerweise wird die Größe und Lage der Komponenten eines Containers durch einen LayoutManager bestimmt. Dadurch ist es relativ einfach möglich, Oberflächen zu erstellen, die sich an die jeweilige Fenstergröße anpassen.

In seltenen Fällen, z. B. bei Spielen, will man Größe und Lage von Komponenten frei festlegen. Dann darf der jeweilige Container keinen LayoutManager verwenden. Wie Du schon richtig geschrieben hast, wird der LayoutManager eines Containers mit Hilfe der Methode setLayout festgelegt. Will man keinen LayoutManager, setzt man null.

Wo Du keinen LayoutManager verwenden willst, kommt natürlich darauf an, was Du machen willst. Du setzt einmal das ContentPane des JFrame auf ein JPanel. Ein JPanel hat standardmäßig ein FlowLayout als LayoutManager, ordnet die Komponenten also einfach nacheinander von links nach rechts an und bricht um, falls der Platz nicht reicht.

Willst Du auf dem ContentPane die Komponenten frei verschieben, musst Du den LayoutManager entfernen. Dazu könntest Du in initialisieren() am Ende getContentPane().setLayout(null); einfügen. Deinem ContentPane fügst Du ein BedienPanelOben ein, d. h. Du müsstest in dem Fall die Bounds von bedienPanelOben setzen.

Das bedeutet aber nicht, dass bedienPanelOben automatisch ebenfalls keinen LayoutManager verwendet. Vielmehr erweitert die Klasse BedienPanelOben die Klasse JPanel. Damit ist standardmäßig ein FlowLayout als LayoutManager gesetzt. Willst Du Größe und Lage der Komponenten von bedienPanelOben frei festlegen, musst Du dort den LayoutManager entfernen.
 

Zurück
Oben