Java, GUI, Hintergrundbild, Image,

Rambo007

Mitglied
Ich bin aktuell dabei ein kleines TextAdventure Game zu erstellen jedoch habe ich aktuell ein Problem wo ich nicht weiter komme.

Ich habe ein Fenster wo ich ein Hintergrundbild eingefügt habe, jedoch schaffe ich es jetzt nicht mehr Texte auf das Bild zu setzen. Möchte gerne eine Überschrift und paar Sachen auf das Bild setzen. Unten finden sie den Hauptcode, es gibt noch eine Klasse namens "Main" wo aber nur eine Zeile Code steht (Die Main-Methode).

Habe sehr viel Gegoogelt und Recherchiert jedoch keinerlei Ergebnisse gefunden obwohl das schon eine Sache ist welches bestimmt nicht nur mir passiert ist, leider gibt es dazu keine Tutorials oder Lösungen.

Java:
package TextAdventure;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Fenster extends JFrame{
    
    JLabel startTitel;
    
    
    
    
    public void paint (Graphics g) { //Wird benötigt um ein Bild einzufügen, Hintergrundbild
        super.paint(g);
        g.drawImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\r-gue\\Desktop\\Programmierung\\Java TextAdventure\\horror.jpg"), 0, 0, this.getWidth(), this.getHeight(),this);
    }
    
    
    public Fenster() { //Erstellen des Fensters und den ganzen Eigenschaften z.B Größe
        setLayout(null);
        setVisible(true);
        setSize(1100,700);
        setTitle("TextAdventure Hexenhaus");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
        

        
        
        startTitel = new JLabel("Text Adventure");
        startTitel.setBounds(100, 50, 300, 200);
        startTitel.setForeground(Color.red);
        add(startTitel);
        
    }
    

}
 

Anhänge

  • ForumFrage.JPG
    ForumFrage.JPG
    182,7 KB · Aufrufe: 8
Hier mal eine Klasse, die Du einfach als Panel verwenden kannst:
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

// for testing purposes
import javax.imageio.ImageIO;
import java.net.URL;

public class ImagePanel extends JPanel {
    private BufferedImage image;
    private Image scaled;

    public ImagePanel(BufferedImage image) {
        this.image = image;
    }

    @Override
    public Dimension getPreferredSize() {
        Insets insets = getInsets();
        int width = insets.left + insets.right + image.getWidth();
        int height = insets.top + insets.bottom + image.getHeight();
        return new Dimension(width, height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        g.drawImage(getScaled(), insets.left, insets.top, null);
    }

    private Image getScaled() {
        Insets insets = getInsets();                
        int w = getWidth() - insets.left - insets.right;
        int h = getHeight() - insets.top - insets.bottom;

        if (scaled == null || scaled.getWidth(null) != w || scaled.getHeight(null) != h) {
            scaled = image.getScaledInstance(w, h, Image.SCALE_SMOOTH);
        }

        return scaled;
    }


    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(new URL("https://upload.wikimedia.org/" +
                "wikipedia/commons/thumb/7/77/Wikipedia_svg_logo.svg/" +
                "768px-Wikipedia_svg_logo.svg.png"));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel = new ImagePanel(img);
                panel.add(new JButton("Test"));
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

Die main-Methode ist natürlich nur zu Testzwecken da (und gehört in der "richtigen Anwendung" entfernt), gleiches gilt für die beiden imports oben.

Toolkit.getDefaultToolkit().getImage("C:\\Users\\r-gue\\Desktop\\Programmierung\\Java TextAdventure\\horror.jpg")
Mach das nicht über absolute Pfade, sondern über Ressourcen.
 
Vielen Dank für die schnelle Antwort, jedoch ist das schon sehr Kompliziert aufgebaut. Bei mir waren es nur drei Zeilen Code, hier sind es eine ganze Seite. Ist diese überhaupt nötig ? Gibt es keinen einfacheren und kürzeren Weg ?
 
Hier mal eine Klasse, die Du einfach als Panel verwenden kannst:
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

// for testing purposes
import javax.imageio.ImageIO;
import java.net.URL;

public class ImagePanel extends JPanel {
    private BufferedImage image;
    private Image scaled;

    public ImagePanel(BufferedImage image) {
        this.image = image;
    }

    @Override
    public Dimension getPreferredSize() {
        Insets insets = getInsets();
        int width = insets.left + insets.right + image.getWidth();
        int height = insets.top + insets.bottom + image.getHeight();
        return new Dimension(width, height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        g.drawImage(getScaled(), insets.left, insets.top, null);
    }

    private Image getScaled() {
        Insets insets = getInsets();               
        int w = getWidth() - insets.left - insets.right;
        int h = getHeight() - insets.top - insets.bottom;

        if (scaled == null || scaled.getWidth(null) != w || scaled.getHeight(null) != h) {
            scaled = image.getScaledInstance(w, h, Image.SCALE_SMOOTH);
        }

        return scaled;
    }


    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(new URL("https://upload.wikimedia.org/" +
                "wikipedia/commons/thumb/7/77/Wikipedia_svg_logo.svg/" +
                "768px-Wikipedia_svg_logo.svg.png"));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel = new ImagePanel(img);
                panel.add(new JButton("Test"));
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

Die main-Methode ist natürlich nur zu Testzwecken da (und gehört in der "richtigen Anwendung" entfernt), gleiches gilt für die beiden imports oben.


Mach das nicht über absolute Pfade, sondern über Ressourcen.



Vielen Dank für die schnelle Antwort, jedoch ist das schon sehr Kompliziert aufgebaut. Bei mir waren es nur drei Zeilen Code, hier sind es eine ganze Seite. Ist diese überhaupt nötig ? Gibt es keinen einfacheren und kürzeren Weg ?
 
Bei mir waren es nur drei Zeilen Code, hier sind es eine ganze Seite.
Das täuscht ein wenig. Nimm mall die main-Methode raus, dann wird es weniger 🙂

OK, ernsthaft: grundsätzlich willst Du ein Hintergrundbild in einem Container (der weitere Komponenten aufnehmen kann), daher bietet sich etwas wie ein JPanel an. Die Aufteilung von Code in Klassen ist grundsätzlich erwünscht; die Klasse kannst Du immer wieder verwenden.

Diese Implementierung bietet eine automatische Skalierung des Bildes. Du kannst das natürlich stark vereinfachen, wenn das Bild nicht skaliert werden soll. Wenn Du dann noch darauf verzichtest, dass die Komponente die passende Größe meldet, dann ist das nicht viel mehr als Dein Code:

Java:
public class ImagePanel extends JPanel {
    private BufferedImage image;

    public ImagePanel(BufferedImage image) {
        this.image = image;
    }

    @Override
    protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        g.drawImage(image, insets.left, insets.top, null);
    }
}
 

Zurück
Oben