Auf Thema antworten

Hallo Gästilein,


der einfachste Weg, ein Bild in Originalgröße auf ein Fenster zu malen, besteht darin, das Bild zu einem JLabel hinzufügen und dieses dann dem Fenster hinzufügen. Ob es einen besseren Weg gibt, hängt von deinen Anforderungen ab. Der Code für diesen einfachen Ansatz wäre so etwas wie:


[code=Java]

JLabel contentPane = new JLabel();

contentPane.setIcon(backgroundImage);

contentPane.setLayout(new BorderLayout());

frame.setContentPane(contentPane);

[/code]


Warum funktioniert das? Nun, erinnere dich mal daran, dass alle Swing-Komponenten die Klasse "Container" erweitern, so dass wir untergeordnete Komponenten hinzufügen können. Jedoch standardmäßig verwendet ein JLabel ein Null-Layout, so dass die Komponenten nicht angezeigt werden. Durch die Verwendung eines BorderLayout im JLabel bekommt dieses eine Panel-Funktion und kann als Content-Bereich verwendet werden.


[code=Java]

import javax.swing.*;

import java.awt.*;


public class ImageDemo {


    ImageDemo() {

        JFrame frame = new JFrame();

        //beendet das Programm, wenn das Fenster geschlossen wird:

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setSize(300, 100);

        //Fenster zentrieren

        frame.setLocationRelativeTo(null);

        //Bild laden:

        ImageIcon backgroundImage = new ImageIcon(getClass().getResource("/pics/Brett3.jpg"));

        //als Hintergrundbild setzen;

        JLabel contentPane = new JLabel();

        contentPane.setIcon(backgroundImage);

        contentPane.setLayout(new BorderLayout());

        frame.setContentPane(contentPane);

        //

        JPanel controls = new JPanel();

        controls.setOpaque(false);//JPanel durchsichtig machen

        JButton b1 = new JButton("eins");

        b1.setPreferredSize(new Dimension(100, 33));

        controls.add(b1);

        JButton b2 = new JButton("zwei");

        b2.setPreferredSize(b1.getPreferredSize());//Buttons gleich groß machen

        controls.add(b2);

        contentPane.add(controls, BorderLayout.PAGE_END);

        frame.setVisible(true);

    }


    public static void main(final String args[]) {

        Runnable gui = new Runnable() {


            public void run() {

                ImageDemo imageDemo = new ImageDemo();

            }

        };

        //jede GUI muss auf dem EventDispatchThread gestartet werden:

        SwingUtilities.invokeLater(gui);

    }

}

[/code]


Gruß,

André



Oben