Hintergrundbild in einem Applet

steff aka sId

Erfahrenes Mitglied
Hi ich habe ein Applet in dieses will ich ein Hintergrund bild einbinden das ganze funktioniert auch allerdings soll auf dem Hintergrund dann ein JPanel liegen mit einem Text das man per Maus auf dem Hintergrund ziehen kann. Was brauche ich dafür für eine Einstellung. Bis jetzt bin ich soweit:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JApplet;

/*
 * Created on 21.02.2005
 */

/**
 * @author Steffen Rumpf
 */
public class Main extends JApplet implements MouseMotionListener{
    
    /**
     * the label which contains the text
     */
    private TextPanel textPanel = null;
    
    private String error = null;
    
    /**
     * the color for the text
     */
    private String color = "not initialized";
    
    /**
     * the font for the text
     */
    private String font = "not initialized";
    
    private String[] text = null;
    
    private Image pic = null;
    
    /** (non-Javadoc)
     * @see java.applet.Applet#init()
     */
    public void init() {
        // read parameter
        color = getParameter("color");
        font = getParameter("font");
        int i = 0;
        // read a variable count of text lines, which are created by a php script
        while(true) {
            if(null == getParameter("text"+i)) {
                break;
            } else {
                if(null == text) {
                    text = new String[1];
                    text[0] = getParameter("text"+i);
                }else {
                    String[] hilf = new String[text.length];
                    System.arraycopy(text, 0, hilf, 0, text.length);
                    text = new String[hilf.length + 1];
                    System.arraycopy(hilf, 0, text, 0, hilf.length);
                    text[i] = getParameter("text"+i);
                }
            }
            System.out.println(text[i]);
            i++;
        }
        
        // NullLayout
        this.getContentPane().setLayout(null);
        
        // set applet background to white
        getContentPane().setBackground(Color.white);
        
        // create the url for the font-file
        URL myurl = null;
        try {
            myurl = new URL(getDocumentBase(), "./fonts/"+font);
        } catch (MalformedURLException e) {
            error = "MalformedURLException";
        }
        
        textPanel = new TextPanel(color, myurl, text, error);
        textPanel.setBounds(25, 75, 350, 90);
        
        this.getContentPane().add(textPanel);
        this.getContentPane().addMouseMotionListener(this);
        
        // create the url for the background image
        try {
            pic = getImage(new URL(getCodeBase()+File.separator+"auto.jpg"));
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
    }
    
    /** (non-Javadoc)
     * @see java.awt.Component#paint(java.awt.Graphics)
     * Paint the background image
     */
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.drawImage(pic, 0, 0, this);
    }
    
    /** (non-Javadoc)
     * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
     * when the mouse is dragged set the bounds of the textPanel to the Position of
     * the mouse cursor. If this position is inside the applet.
     */
    public void mouseDragged(MouseEvent arg0) {
        int x = arg0.getX();
        int y = arg0.getY();
        
        if(x < 0) {
            x = 0;
        }else if( x > 200 - 150 ) {
            x = 200 - 150;
        }
        if(y < 0) {
            y = 0;
        }else if( y > 200 - 90 ) {
            y = 200 - 90;
        }
        textPanel.setOpaque(true);
        textPanel.setBounds(x, y, 350,90);
        repaint();
    } 
        
    public void mouseMoved(MouseEvent arg0) {
        // Not used    
    }
}

Greetz Steff

P.s. Kennt einer eventuell einen Link wo so etwas erklärt wird?
 
Zuletzt bearbeitet:
Das Problem ist wohl das ich die Paint Methode überschreibe um dies zu umgehen brauche ich folgendes:
Code:
super.paint(g2)
Hab das wie folgt probiert:
Code:
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        super.paint(g2);
        g2.drawImage(pic, 0, 0, this);
    }
Bringt allerdings nichts. So wird erst meine Swing komponente (textPanel) geladen und dann doch wieder von dem Hintergrundbild überschrieben.

Gruß Steff

Noch als Hinweis der vieleicht weiterhilft auf dem panel gebe ich einen Text mit paint() aus.

Code:
import java.awt.Font;
import java.awt.FontFormatException;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;

import javax.swing.JLabel;
import javax.swing.JPanel;

/*
 * Created on 11.03.2005
 */

/**
 * @author Steffen Rumpf
 */
public class TextPanel extends JPanel {
    
    private String color = null;
    
    private String[] text = null;
    
    private URL url = null;
    
    private String error = null;
    
    private Font customFont = null;
    
    public TextPanel(String color, URL url, String[] text, String error) {
        this.color = color;
        this.url = url;
        this.text = text;
        this.error = error;
        
        setOpaque(false);
        
        try {
            //Create a special font which is not in the system
            
            customFont = Font.createFont(
                    Font.TRUETYPE_FONT, 
                    new DataInputStream(url.openStream()));
            customFont = customFont.deriveFont( 0, 12f );
        } catch (FileNotFoundException e) {
            this.error = "FileNotFoundException";
        } catch (FontFormatException e) {
            this.error = "FontFormatException";
        } catch (IOException e) {
            this.error = "IOException";
        }
        JLabel eintext = new JLabel("Hallo");
        eintext.setOpaque(false);
        add(eintext);
    }
    
//    public void paint(Graphics g) {
//        if(color.equals("black")) {
//            g.setColor(Color.black);
//        }else if(color.equals("red")) {
//            g.setColor(Color.red);
//        }else if(color.equals("blue")) {
//            g.setColor(Color.blue);
//        }
//        
//        g.setFont(customFont);
//        int line = 13;
//        for(int i = 0; i < this.text.length; i++) {
//            g.drawString(this.text[i], 15, line);
//            line += 15;
//        }
//        g.drawString(g.getFont().getFontName(), 15, line);
//        g.drawString(color, 15, line += 15);
//        if(null != error) {
//            g.drawString(error, 15, line += 15);
//        }
//    }

}

Hier mal die Klasse TextPanel auf der ich den Text ausgebe
 
Zuletzt bearbeitet:
Da mir niemand Helfen wollte hier jetzt die Lösung:

Ich hab mir ein neues Panel(doublebuffered) erstellt welches das Hintergrundbild bekommt und auf dieses Panel kann man dann alle Swing Componenten etc. adden. Das Panel sieht wie folgt aus:
Code:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

/*
 * Created on 15.03.2005
 */

/**
 * @author Steffen Rumpf
 */
public class BackgroundPanel extends JPanel{
    private URL url = null;
    
    public BackgroundPanel(URL url) {
        super(true);
        this.url = url;
    }
    
    /** (non-Javadoc)
     * @see java.awt.Component#paint(java.awt.Graphics)
     * Paint the background image
     */
    public void paint(Graphics g) {
        
        BufferedImage pic = null;
        // create the url for the background image
        try {
            pic = ImageIO.read(url);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        g.drawImage(pic, 0, 0,this);
        super.paint(g);
    }

}
Das adden der Componenten läuft dann so:
Code:
...
        // create url for the background image
        URL url = null;
        try {
            url = new URL(getCodeBase()+File.separator+"auto.jpg");
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
        // create panel which includes the background image
        BackgroundPanel backImgPanel = new BackgroundPanel(url);
        backImgPanel.setLayout(null);
        backImgPanel.setOpaque(false);
        backImgPanel.add(textPanel);

        this.getContentPane().add(backImgPanel);
...

Greetz Steff
 
Zurück