# [AWT] image im panel / applet



## Guest (1. Feb 2008)

hi,ist folgendes Grundsätzlich möglich.

ich habe ein applet. nun nehme ich ein panel. und will ich in der init methode in einer scheife Bilder laden und die in dieses Panel tun. kann ich für jedes image ein mouseclickevent usw dynamisch erstellen?

jetzt mal zur konkreten implementierung die nicht klappt


```
public class muh extends Applet  implements ActionListener {
      Label label;
      Button button;

       Image img;
   public void init() {
      setBackground(Color.orange);

      label = new Label();

      add(label);
      button = new Button("Knopf");
      button.setBackground(Color.white);
      button.addActionListener(this);


       img = getImage("http://www.");
       add(img);
   }
```

dankeschön


----------



## Quaxli (1. Feb 2008)

Einfach mal die Board-Suche nutzen...


----------



## Guest (1. Feb 2008)

hehe hab ich shcon getan aber ohne irgendwas wirklich nützliches.willst du mir vllt nicht einfasch bei dieesem konkreten und nicht so konkreten problem helfen


----------



## L-ectron-X (1. Feb 2008)

Vielleicht findest du hier einen Ansatz: http://www.java-forum.org/de/viewtopic.php?t=29968


----------



## Guest (1. Feb 2008)

ah okay. ist des dann kluck alle erzeugten images in ein array oder liste zu packen und dann in der paint methode erst zeichnen?

also sowas in der init methode

for (i .....i++){
meinarray_ = getImage (getCodeBase (), "http://"); 

// hie rnoch irgendwelceh eventdinger registieren am object/img?
}


des würd klappen?_


----------



## Guest (1. Feb 2008)

wobei , seh ich des grad richtig dass am image keine events registriert werden können? ich blick da grad garnich durch.hilfe wär super.vielen vielen dank


----------



## Guest (1. Feb 2008)

okay also hab grad folgendes gemacht,aber da kommt der fehler applet not intiatlisiert


```
*
 * NewApplet1.java
 *
 * Created on 1. Februar 2008, 15:36
 */

package javaapplication2;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author  
 */
public class NewApplet1 extends java.applet.Applet  implements ActionListener {
   Image[] bildersammlung;
    /** Initializes the applet NewApplet1 */
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                    for (int x=0;x<100;x++){
                       bildersammlung[x] = getImage (getCodeBase (), "http://"); 
                      
                    }
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public void paint(Graphics g){
        
    }
    
     public void actionPerformed(ActionEvent e) {
      //label.setText("Damn - you pressed it ...");
      System.out.println(e);
      //remove(button);
   }
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setLayout(new java.awt.BorderLayout());
    }// </editor-fold>
    
    
    // Variables declaration - do not modify
    // End of variables declaration
    
}
```
[/quote]


----------



## L-ectron-X (1. Feb 2008)

An einem Image kann kein Listener registriert werden.

Es kommt ganz darauf an, was du machen möchtest.
Du kannst die Bilder auf Komponenten zeichnen lassen bspw. ein Label oder ein Button. An diese Komponenten kannst du auch Listener registrieren.
Allerdings kannst du unter AWT die Bilder nicht so einfach auf die Labels/Buttons setzen, wie das mit Swing möglich ist. Im AWT musst du die paint()-Mathode so überschreiben, dass sie die Bilder zeichnet.



			
				Gast hat gesagt.:
			
		

> ... da kommt der fehler applet not intiatlisiert ...


Warum das Applet nicht initialisiert wurde, kannst du der Java-Console entnehmen.


----------



## Guest (1. Feb 2008)

ah okay, des hilf shcon weiter 

ich würd halt nun gern in der paint methode auf ein panel anwenden? das müsste doch gehen? ich werds dann so machen einfach den event vom panel nehmen und dann rechnen 

jetzt aber des nächste problem,wie sag ich den dem panel was ich erzeugt hab dass ich die bilder da drin haben will.

wenn ich add verwende kent er add aufeinmal nicht. hier das beispiel


```
Panel spielfeld = new Panel(null);
                    for (int x=0;x<100;x++){
                       bildersammlung[x] = getImage (getCodeBase (), "http://"); 
                     spielfeld.add(bildersammlung[x]); //geht nicht
                    }

wie kann amn dass den sonst machen? in der paint methode??? aber wei dann dass es im spielfeld ist?

Vielen dank ist echt super die Hilfe hier!!!
```


----------



## L-ectron-X (1. Feb 2008)

Anonymous hat gesagt.:
			
		

> wie sag ich den dem panel was ich erzeugt hab dass ich die bilder da drin haben will


Du zeichnest die Bilder in der paint()-Methode.
Dafür gibts die drawImage()-Methode aus Graphics.

Den MouseListener hängst du ans Panel und kannst so ermitteln, wo sich die Maus befindet.
Anhand der Bilddimensionen kannst du berechnen, ob sich die Maus gerade über einem Bild befindet.


----------



## Guest (1. Feb 2008)

ah okay,dann is der imageobserver beim spielfeld panel. dann ist das Bild automatisch im spielfeld panel und passt sich dem da angegeben layout manager an?

oder wie?

irgdnwie glaub ich fehlt hier noch son bissal das grundverständnis.wär vllt ganz cool wenn da wer den einen oder anderen satz dazu verlieren könnte. danke


----------



## L-ectron-X (1. Feb 2008)

LayoutManager können nur Components positionieren. Wenn du möchtest, dass ein LM die Positionierung übernimmt, musst du die Bilder vorher bspw. auf ein Label zeichnen. Dazu musst du unter AWT, wie oben bereits erwähnt" die paint()-Methode überschreiben und darin das Bild zeichnen.
Eine mögliche Label-Klasse ohne resize könnte so aussehen:

```
import java.awt.Label;
import java.awt.Image;
import java.awt.Graphics;

public class PictureLabel extends Label {
   private Image image

   public PictureLabel(Image image) {
      super();
      this.image = image;
   }

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

   public void paint(Graphics g) {
      super.paint(g);  
      if(image != null) {
         g.drawImage(image, 0, 0, this);
      }
   }
}
```

Es fehlt der Code zur Anpassung im Layout. Der muss ggf. an deine Bedingungen angepasst werden.


----------



## Guest (2. Feb 2008)

okay naja jetzt paar studenn älter abe rnicht viel klüger.ich hab mal alles so gemacht wie ichs für richtig halt.dann start ich dass applet und es is komplett leer?!?!?! voll fürn arsch 

willst du /ihr des mal anschauen was da falsch ist?

hier die applet datei


```
/*
 * NewApplet1.java
 *
 * Created on 1. Februar 2008, 15:36
 */


import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author
 */
public class NewApplet1 extends java.applet.Applet  implements ActionListener {
   PictureLabel[] bildersammlung;
    /** Initializes the applet NewApplet1 */
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {

                    Panel spielfeld = new Panel(null);
                    PictureLabel ui = new PictureLabel(getImage (getCodeBase (), "http://www.greensmilies.com/smile/smiley_emoticons_pfeif.gif"));
                    for (int x=0;x<100;x++){
                       bildersammlung[x] = ui;
                         add(ui);
                     panel1.add(bildersammlung[x]);
                    }
                    add(spielfeld);
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void paint(Graphics g){
          for (int x=0;x<bildersammlung.length;x++){
            bildersammlung[x].paint(g);
          }
    }

     public void actionPerformed(ActionEvent e) {
      //label.setText("Damn - you pressed it ...");
      System.out.println(e);
      //remove(button);
   }
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        panel1 = new java.awt.Panel();
        label1 = new java.awt.Label();
        label2 = new java.awt.Label();

        add(panel1);

        label1.setText("label1");
        add(label1);

        label2.setText("label2");
        add(label2);
    }// </editor-fold>


    // Variables declaration - do not modify
    private java.awt.Label label1;
    private java.awt.Label label2;
    private java.awt.Panel panel1;
    // End of variables declaration

}
```
und hier die labelpaint klasse dings


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



/**
 *
 * @author
 */
import java.awt.Label;
import java.awt.Image;
import java.awt.Graphics;

public class PictureLabel extends Label {
   private Image image;

   public PictureLabel(Image image) {
      super();
      this.image = image;
   }

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

   public void paint(Graphics g) {
      super.paint(g);
      if(image != null) {
         g.drawImage(image, 0, 0, this);
      }
   }
}
```
[/quote]


----------



## L-ectron-X (2. Feb 2008)

Also, damit dein Code funktioniert, muss er mindestens signiert sein! Dein Applet versucht auf Resourcen auf einem fremden Server zuzugreifen. Das dürfen "normale" Applets nicht.
Das ist auch erkennbar, wenn du mal deine Java-Console öffnest. Darin finden sich alle Fehler während der Ausführung eines Applets und sollte für dich erste Anlaufstelle bei Problemen sein.

Ich will hier nicht nur rumlabern, guck dir mal dieses Applet an. Darin werden in einer verbesserten Klasse von PictureLabel die Bilder gezeichnet. Das Applet ordnet die Labels mit Hilfe des GridLayouts an und läd die Bilder in die Labels.

Die Bilddateien liegen hier samt Quellcode und Bytecode-Dateien in einer Jar-Datei, die du dir herunterladen und mit einem Packprogramm entpacken und ansehen kannst.


----------



## Guest (2. Feb 2008)

cool danke, dann bin ich ja da shcon auf dem richtigen weg. naja bei mir sagt die java konsole nullpointer blah blah in der zeile wo ich des bild lad.
wie is denn des mit dokumentbase.
also sagen wir mal ich mach des hier

bildersammlung[x] = new PictureLabel(getImage (getDocumentBase(),"lala.gif"));

also das bild ist im selben verzeichnis wie das applet selber.

was muss ich dann im applet tag angeben dass des klappt, ich hab grad total lang gegoogelt aber ich find da keine richtige erklärung

<applet code="NewApplet1.class" DocumentBase="???" width="400" height="300">

oder soll man da codebase verwenden?

danke für die hilfe,ich galub wenn des hinhaut sollt der rest eigentlich alles gehen,nur dieses blöde bild laden macht mich total fertig [/code]


----------



## Leroy42 (2. Feb 2008)

Anonymous hat gesagt.:
			
		

> sagt die java konsole _nullpointer blah blah_ in der zeile wo ich des bild lad.



Das ist ja mal ne tolle Fehlermeldung!

Benutzt du etwa deine eigene *JVM*?  ???:L (  )


----------



## L-ectron-X (2. Feb 2008)

Anonymous hat gesagt.:
			
		

> also sagen wir mal ich mach des hier
> 
> bildersammlung[x] = new PictureLabel(getImage (getDocumentBase(),"lala.gif"));


getDocumentBase() besorgt dir den relativen URL zur HTML-Datei.



			
				Anonymous hat gesagt.:
			
		

> also das bild ist im selben verzeichnis wie das applet selber.


Dann belass es bei getCodeBase().



			
				Anonymous hat gesagt.:
			
		

> was muss ich dann im applet tag angeben dass des klappt, ich hab grad total lang gegoogelt aber ich find da keine richtige erklärung
> 
> <applet code="NewApplet1.class" DocumentBase="???" width="400" height="300">
> 
> oder soll man da codebase verwenden?


Nichts weiter.

```
<applet code="NewApplet1.class" width="400" height="300">
</applet>
```
Genügt völlig. Den Rest besorgt dann das (korrekt) programmierte Applet.
Es gibt zwar noch ein codebase-Attribut für das Applet-Tag, aber das ist nur interessant, wenn sich das Applet auf einem ganz anderen Server befindet. Dann läd die HTML-Datei das Applet von einem anderen Rechner.

Ansonsten schaust du dir den Code von meinem Beispiel an, da wird gezeigt, wie du mit getCodeBase() ein Bild von einem lokalen URL laden kannst.


----------



## Guest (2. Feb 2008)

ja shcon hab ich mir angekuckt,da läufts auch, nur irgdnwie bei meinem ding nicht

also die console gibt den fehler 


```
java.lang.reflect.InvocationTargetException
	at java.awt.EventQueue.invokeAndWait(Unknown Source)
	at NewApplet1.init(NewApplet1.java:19)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at NewApplet1$1.run(NewApplet1.java:25)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

bei dem code 

```
bildersammlung[x] = new PictureLabel(getImage (getCodeBase(),"bombe.gif"));
```

des müsste doch klappen?

ich versteh des einfahc nicht ,ist doch genau des was du gerade gesagt hast und hört sich auch alles sehr sinnvoll an nur irgdnwie hmm


----------



## L-ectron-X (2. Feb 2008)

> Caused by: java.lang.NullPointerException
> at NewApplet1$1.run(NewApplet1.java:25)



Schau in deine Zeile 25. Irgendeine Referenz existiert noch nicht. Vielleicht konnte das Bild auch nicht geladen werden...

Und: Schmeiß mal die for-Schleife raus, in der du die Bilder lädst. Das funktioniert nur, wenn die Bilder auch Zahlennamen haben.


----------



## Guest (2. Feb 2008)

hm ich hab jetzt einfahc dein beispiel jar übernommen und da alles abgewandelt, auch wnens ungefähr genau gleich geschrieben ist jetzt bei mir.sehr sehr merkwürdig  aber die for schleife haut hin.najaj jetzt mal kucken wie ich voran komm,meld mich bestimtm gleich nochmal mit problemen.aber schonmal danke für die super hilfe


----------



## Guest (2. Feb 2008)

okay da hängts shconwieder 

also grundsätzlich kann ich doch zeugs in ein panel packen und dieses panel dann im hauptfenster tun. also z.B ein Panel mit so nem nebeneinander layout und das main layout im border style und sowas.also kurz gesagt schachteln 

nur jetzt bei meinem neuen code zeigt er nur den button an. muss man  da was besodneres beachten beim schachteln?


```
import java.applet.*;
import java.awt.*;

public class PictureApplet extends Applet {
   private PictureLabel[] pictureLabs;
   
   public void init() {
      setLayout(new GridLayout(0, 4, 2, 2));
              Panel bilder = new Panel(null);
      pictureLabs = new PictureLabel[100];
      for (int x=0;x<100;x++){
          pictureLabs[x] = new PictureLabel(getImage(getClass().getResource("pics/bombe.gif")));
            bilder.add(pictureLabs[x]);
      }

         Button button = new Button();
     add(button);
      add(bilder);

   }
}
```


----------



## L-ectron-X (2. Feb 2008)

Dein Panel muss nicht das NullLayout sondern das GridLayout erhalten.


----------



## Guest (2. Feb 2008)

passt  du bist der mega java crack  danke


----------

