Java "Hintergrundbild" für JFrame wird nicht angezeigt!

Chris1896

Newbie
Registriert
März 2013
Beiträge
2

Hallo ihr Lieben,
ich bin seit Stunden ziemlich verzweifelt. Hoffe ihr könnt mir helfen.

Bin dabei ein Cocktailmanager zu schreiben und habe ein Startfenster gebastelt, auf dem zwei Button liegen (BoxLayout).
Hinter diesen soll ein Bild liegen, also eine Art Hintergrundbild.
Das habe ich versucht mit dem Layered Pane zu verwirklichen.

Gibt zwei Klassen:

1. Startfenster:
Code:
public class Startfenster extends JFrame implements ActionListener  {
    
    protected JButton cocktailRezeptStart;
    protected JButton cocktailAbendStart;
    private JPanel startPanel = new JPanel();
    private Cocktailrezept cocktailRezeptPanel;
    
    private CocktailListe cocktailListe;
    private CocktailListe cocktailAbendListe;
    
    private StartfensterBild hintergrund;
    private JLayeredPane layeredPane;
   
    public Startfenster() {
        
        init();
        startLayout();
        setSize(800, 500);
        setVisible(true);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }

    private void startLayout() {
    
        setTitle("Cocktail-Manager 1.0");
        getContentPane().setLayout(new BorderLayout());

        JPanel button = new JPanel();
        button.setLayout(new BoxLayout(button, BoxLayout.Y_AXIS));
        button.add(cocktailRezeptStart);       
        button.add(Box.createRigidArea(new Dimension(100, 100)));
        button.add(cocktailAbendStart);
        button.setBorder(BorderFactory.createEmptyBorder(200, 200, 500, 200));

        startPanel.setLayout(new CardLayout());
        startPanel.add(button, "StartPanel");
        cocktailRezeptPanel = new Cocktailrezept(cocktailListe, cocktailAbendListe);
        startPanel.add(cocktailRezeptPanel, "CocktailRezeptPanel");
        getContentPane().add(startPanel, BorderLayout.CENTER);
        
        layeredPane.add(hintergrund, new Integer(0), 0);
        layeredPane.add(button, new Integer(1), 0);
        getContentPane().add(layeredPane, BorderLayout.CENTER);
        
    }

    private void init() {

        cocktailRezeptStart = new JButton("Cocktailrezept");
        cocktailRezeptStart.setFont(new Font( "Calibri", Font.BOLD, 30));
        cocktailAbendStart = new JButton("Cocktailabend");
        cocktailAbendStart.setFont(new Font( "Calibri", Font.BOLD, 30));
        cocktailAbendStart.addActionListener(this);
        cocktailRezeptStart.addActionListener(this);
        
        hintergrund = new StartfensterBild();
        layeredPane = new JLayeredPane();
        
    }

    public void actionPerformed(ActionEvent click) {

        if (click.getSource() == cocktailRezeptStart) {
            ((CardLayout) startPanel.getLayout()).show(startPanel,
            "CocktailRezeptPanel");
        } else if (click.getSource() == cocktailAbendStart) {
            new Cocktailabend();
        }
    }


    public static void main(String[] args) {
        new Startfenster();
    }

}


2. Klasse StartfensterBild:

Code:
public class StartfensterBild extends JPanel {

    
    private Toolkit toolkit;
    private Image image;
    
    public StartfensterBild() {
    
        super(null);
        repaint();       
    }
    
    public void paintComponent(Graphics g) {
    
        toolkit = Toolkit.getDefaultToolkit();
        image = toolkit.createImage("C:\\bild.jpg");
        g.drawImage(image, 0, 0, this);
        this.paintChildren(g);    
    }
    

}

Wäre toll wenn mir jemand weiterhelfen kann, wo das Problem liegt.
 
Vielleicht der Pfad falsch angegeben?

Versuchs mal mit einem Backslash. Zudem ich das hier auf ner anderen Seite gefunden habe was bei Ihm die Lösung war, ein Bild als Background von einem Panel festzulegen!

Code:
package Image;
 
/**
 * @author Domenico Thöni
 * 
 */
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class BackgroundPanel extends JPanel{
    
    public static void main(String[] args)
    {
        String pic;
        JLabel textLabel = new JLabel();
        JFrame fra = new JFrame();
 
        pic = "C:/my.jpg";
 
        JLabel backImgPanel = new JLabel(new ImageIcon("C:/my.jpg"));
        
        backImgPanel.setLayout(null);
        backImgPanel.setOpaque(false);
        
        backImgPanel.add(textLabel);        
        textLabel.setText("Vorder");
        textLabel.setBounds(0,0,200,100);
 
        fra.getContentPane().add(backImgPanel);
        backImgPanel.setBounds(0,0,400,300);
        
        fra.pack();
        fra.show();
    }
}

Vielleicht hilfts dir ja :)
 
Nix mit Slashes...

In der Paint solltest du auch nicht ständig das Bild neu laden... total sinnlos... dauert auch viel zu lange...

Code:
public class StartfensterBild extends JPanel {
 
    private final Image image;
    private final Dimension preferredSize;
    
    public StartfensterBild() {
        final Toolkit toolkit = Toolkit.getDefaultToolkit();
        image = toolkit.createImage("C:\\bild.jpg");
        preferredSize = new Dimension(image.getWidth(null), image.getHeight(null));
    }
    
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
    
    public Dimension getPreferredSize() {
    	return preferredSize;
    }
    
 
}

funktioniert bei mir, wenn ich es einem einfachen Layout hinzufüge... aber ein Problem gibt's da noch... die Größe... und zwar hat das Ding ja keine bevorzugte Größe, die sollte es aus dem Bild "entnehmen"...

edit: Code aktualisiert und bevorzugte Größe hinzugefügt...
 
Zuletzt bearbeitet:
Das ist nicht mein Code, wollte ich nur erwähnen!

Und das mit den Slashes war ne Idee, da manche Sprachen das escapen und andere nicht...

Gruß
 
Dankeschön für eure Hilfe.

Habe jetzt meine 2. Klasse StartfensterBild editiert, wie du es vorgeschlagen hast.
Füge ich jetzt "hintergrund" (wie ich die Instanz von der 1.Klasse genannt habe) ein,
zeigt er mir das Bild an, das ist schonmal super!

jedoch zeigt er mir im BoxLayout das Bild nur an der Stelle an, wo ich es eingefügt habe, beispw.:

Code:
private void startLayout() {
    
        setTitle("Cocktail-Manager 1.0");
        getContentPane().setLayout(new BorderLayout());

        JPanel button = new JPanel();
        button.setLayout(new BoxLayout(button, BoxLayout.Y_AXIS));
-->   button.add(hintergrund);
        button.add(cocktailRezeptStart);       
        button.add(Box.createRigidArea(new Dimension(100, 100)));
        button.add(cocktailAbendStart);
        button.setBorder(BorderFactory.createEmptyBorder(200, 200, 500, 200));
        startPanel.setLayout(new CardLayout());
        startPanel.add(button, "StartPanel");
        cocktailRezeptPanel = new Cocktailrezept(cocktailListe,
            cocktailAbendListe);
        startPanel.add(cocktailRezeptPanel, "CocktailRezeptPanel");  
        getContentPane().add(startPanel, BorderLayout.CENTER);
        
    }

Jetzt kriege ich einen kleinen Bildstreifen über den Button.
Wie kann ich es einstellen, dass er für das gesamte BoxLayout das Bild hinter den Button einfügt?
Ergänzung ()

Ich Hohlkopf!

Hab es schon raus :)

Tausend dank!

Werde gleich noch den Lösungscode hinterher posten :)
 
@Coocy: Wenn der Code von dir gewesen wäre, hätte ich den schon kritisiert... der war ja nicht wirklich schwer zu googlen...
 
Zurück
Oben