Buttons auf ein Hintergrundbild(JFrame) setzen

Diskutiere Buttons auf ein Hintergrundbild(JFrame) setzen im Java Basics - Anfänger-Themen Bereich.
J

JustNobody

Ich habe noch gewisse Probleme, das alles zu verstehen. Ist evtl. das Problem, dass mehrere Elemente sich gegenseitig überlappen?

Wenn Du den auskommentierten Code mit dem JLabel MH aktivierst, dann dürfte das Label ja im Anschluss durch das JPanel verdeckt werden. Daher wäre es wichtig, dass man da den Baum mit den Elementen entsprechend anpasst (also z.B. so ein Label dann in das JPanel packen? Habe mir die ganze Struktur aber nicht im Detail angesehen) oder ggf. die Reihenfolge des Hinzufügens anpasst.
 
E

Einsal

Java:
deinecontentpaneoderlayout.repaint();
deinecontentpaneoderlayout.revalidate();
;)
Danke
leider bringt das auch nichts.
nutze ich repaint, ändert sich nichts, der Hintergrund bleibt grau, keine Hintergrundbild und auch keine Buttons.
bei revalidate kommt zumindest beides zur hälfte, wie auf den Bild zu sehen
Unbenannt.jpg

ich verstehe nur nicht warum es in der neuesFenster Class funktioniert und in der Frame Class nicht.
schauen für mich vom Code fast identisch aus
 
E

Einsal

Ich habe noch gewisse Probleme, das alles zu verstehen. Ist evtl. das Problem, dass mehrere Elemente sich gegenseitig überlappen?

Wenn Du den auskommentierten Code mit dem JLabel MH aktivierst, dann dürfte das Label ja im Anschluss durch das JPanel verdeckt werden. Daher wäre es wichtig, dass man da den Baum mit den Elementen entsprechend anpasst (also z.B. so ein Label dann in das JPanel packen? Habe mir die ganze Struktur aber nicht im Detail angesehen) oder ggf. die Reihenfolge des Hinzufügens anpasst.
Ja das war mein Fehler, der auskommentierte Code ist dann natürlich drin und das JPanle add ich zu den JLabel

Hier nochmal der richtige Code

Code:
package Game;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Frame extends JFrame implements ActionListener{
    
    private JLabel MH;
    private JPanel ST;
    private JButton Start;
    private JButton Laden;
    private JButton Schliessen;
    //private Icon Picture2;
    
    public Frame() {
        super ("Game");
        
        
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setResizable(false);
        
        
        Icon Picture2 = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
        MH = new JLabel(Picture2);
        add(MH);

        Font schriftart = new Font("Algerian", Font.BOLD , 30);
        

        
        ST = new JPanel();
       // ST.setBackground(Color.CYAN);
        ST.setLayout(null);
        ST.setBounds(0, 0, 800, 800);
        MH.add(ST);
        
        Start = new JButton("START");
        Start.setBounds(600, 350, 300, 50);
        Start.setFont(schriftart);
        Start.addActionListener(this);
        ST.add(Start);
        
        Laden = new JButton("LADEN");
        Laden.setBounds(600, 420, 300, 50);
        Laden.setFont(schriftart);
        Laden.addActionListener(this);
        ST.add(Laden);
        
        Schliessen = new JButton("SCHLIESSEN");
        Schliessen.setBounds(600, 490, 300, 50);
        Schliessen.setFont(schriftart);
        Schliessen.addActionListener(this);
        ST.add(Schliessen);
        
        MH.revalidate();
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if(e.getSource() == Schliessen) {
            this.dispose();
        }
        else if (e.getSource() == Start) {
            
            NeuesFenster F = new NeuesFenster();
            this.dispose();
            
            
        }
        else if (e.getSource() == Laden) {
            
            JOptionPane.showMessageDialog(getParent(), "Jetzt wird geladen");
        }

    }   
}
 
mihe7

mihe7

Also, ich verstehe das Problem nicht ganz. Du willst ein JPanel haben, das im Hintergrund ein Bild anzeigt. Quick & Dirty sieht eine Implementierung dazu so aus:
Java:
import java.awt.Image;
import java.awt.Graphics;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {
    private Image image;

    public void setBackground(Image image) {
        this.image = image;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        if (image != null) {
            g.drawImage(image, 0, 0, null);
        }
    }
}
Diese Klasse kannst Du nun überall verwenden, wie jedes andere JPanel auch, z. B.
Java:
import java.awt.*;
import java.net.*;
import java.io.IOException;
import javax.imageio.*;
import javax.swing.*;

public class Test {

    public void run() {
        ImagePanel panel = new ImagePanel();

        JPanel buttons = new JPanel(new GridLayout(0,1,0,50));
        buttons.setOpaque(false); // Hintergrund des Panels nicht zeichnen
        for (int i = 0; i < 5; i++) {
            buttons.add(new JButton("Button " + (i+1)));
        }

        JTextField urlField = new JTextField(50);
        urlField.addActionListener(e -> {
            try {
                URL url = new URL(urlField.getText());
                panel.setBackground(ImageIO.read(url));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });

        panel.setLayout(new BorderLayout());
        panel.add(buttons);
        panel.add(urlField, BorderLayout.SOUTH);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
Wenn Du in das Textfeld eine URL eingibst und mit Return bestätigst, wird das Hintergrundbild gesetzt, z. B. liefert https://upload.wikimedia.org/wikipe...docia_Balloon_Inflating_Wikimedia_Commons.JPG folgendes:
Bildschirmfoto von »2020-09-03 00:00:28«.png
 
E

Einsal

Vielen Dank für eure Mühe die ihr euch gemacht habt, ich finde es super das man als Anfänger so viel Hilfe von euch bekommt.
Ich habe es jetzt Dank euch endlich hin bekommen. Mein JPanel hatte nicht die richtigen Werte, ich habe .setOpaque(false); vergessen und mit der .revalidate(); habe ich jetzt auch in dieser Class es geschafft das Hintergrundbild anzuzeigen.

Vielen Dank noch einmal 👍👍👍:D:D:D
 
Thema: 

Buttons auf ein Hintergrundbild(JFrame) setzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben