# ActionListener auf BufferedImage



## --- (14. Aug 2007)

Hallo,

ich habe vergebens versucht einen ActionListener einem BufferedImage hinzuzufügen.
Ziel ist, dass bei Click auf das image ein frame mit einer Textarea aufpoppt.

Image anlegen ist OK

```
try {
        	 
           backgr = ImageIO.read(new File("xxx.jpg"));
   
           }
           catch(IOException e)
              {
              System.err.println(e.getMessage());
               }
```

Jetzt weis ich nicht, wie ich den Listener dem image zuweise


```
bar.addActionListener(new ActionListener() { 
              public void actionPerformed(ActionEvent evt) { 
                  jMenuItem1ActionPerformed(evt); 
              } 
          });
```

Das liefert folgenden Fehler:
	- The method addActionListener(new ActionListener(){}) is undefined for the type 
	 BufferedImage
Muss ich einen eigenen Listener für das image schreiben? 

Hoffe auf Hilfe, danke!


----------



## MarcoBehnke (14. Aug 2007)

Der ActionLIstener muss auf das, was das Bild anzeigt, nicht auf das Bild.


----------



## --- (14. Aug 2007)

Oh, danke!
Ich probiers aus.


----------



## --- (14. Aug 2007)

Wie wähle ich eine bestimmte Componente aus? Der Listener ist ja jetzt nicht auf dem Image, sondern eine Componente höher auf JFrame f.

Bei einem Button wärs 

```
if (e.getButton() == MouseEvent.BUTTON)
```

das geht fürs image ja nicht:


```
f.addMouseListener(new MouseAdapter(){
              public void mouseClicked(MouseEvent e) { 
                 if (e.getComponent () == MouseEvent.)  //???
                 { 
                    System.out.println("2DFSRF"); 
                 } 

              }
```


ich steh aufm Schlauch..


----------



## MarcoBehnke (14. Aug 2007)

Zeig mal mehr Code. Wo wird das Hintergrundbild eingefügt und so.


----------



## --- (14. Aug 2007)

Danke für Antwort!

hier ist der code: 
(Keylistener ist ne Klasse um das image zu verschieben, hat nix mit meinem Probl. zu tun)


```
class Test extends JPanel
{
   BufferedImage bar;
  static BufferedImage backgr;
  
   static JFrame f;

    public Test ()
    {
       setPreferredSize(new Dimension(800, 574));
        try {
 
           backgr = ImageIO.read(new File("schedule.jpg"));
   
           }
           catch(IOException e)
              {
              System.err.println(e.getMessage());
               }
           f.addMouseListener(new MouseAdapter(){
              public void mouseClicked(MouseEvent e) { 
                 if (e.)  //??
                 { 
                 //   System.out.println("In Listerner"); 
                 } 

              }
           }
       );
           
           
           
 /*          bar.addActionListener(new ActionListener() { 
              public void actionPerformed(ActionEvent evt) { 
                  jMenuItem1ActionPerformed(evt); 
              } 
          }); 

    } */


    }

    public void paint(Graphics g) {
        super.paint(g);
        
        g.drawImage(backgr, 230, 80, this);


     }
   
    public static void main( String args[] ) {
    f = new JFrame();
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      f.setSize ( 800, 574 );
        JPanel p = new JPanel();       
        BorderLayout layout = new BorderLayout();
      
        p.setLayout ( layout );
        p.add ( new test() );
       
        p.setVisible( true );
        p.addKeyListener(new Keyboard());
        p.setFocusable ( true );
        
        f.getContentPane().add ( p );
        f.setVisible( true );

    
        }
```


----------



## MarcoBehnke (14. Aug 2007)

hm... erstmal fällt mir auf, dass du in Deiner Main Methode Deine Klasse Test gar nicht verwendest?

statt f.addMouseListener() musst Du dann this.addMouseListener() verwenden und dann in der mouseClicked() f.show() aufrufen.


----------



## --- (14. Aug 2007)

-hm... erstmal fällt mir auf, dass du in Deiner Main Methode Deine Klasse Test gar nicht verwendest? 

Ich dachte, da ich keine Methoden aus Test verwende brauche ich das nicht. Das Panel erzeuge ich ja auch in main.
Also, so wie der code war hat er ohne listener funktioniert. 

-statt f.addMouseListener() musst Du dann this.addMouseListener() verwenden und dann in der mouseClicked() f.show() aufrufen.
Sorry, aber wo ist der Unterschied zwischen f.add und this? Hinter dem this steckt doch f oder verstehe das falsch?

also hier ist mein neuer code +anderer ListenerKlasse:

```
class Test extends JPanel
{
   BufferedImage bar;
  static BufferedImage backgr;
  
   static JFrame f;

    public Test()
    {
       setPreferredSize(new Dimension(800, 574));
        try {
 //       	if (offImage != null)
 //               g.drawImage(offImage, 0, 0, this); 
        	bar = ImageIO.read(new File("client.png"));
           System.out.println(new File("client.png").exists()); 
           backgr = ImageIO.read(new File("schedule.jpg"));
   
           }
           catch(IOException e)
              {
              System.err.println(e.getMessage());
               }
           this.addMouseListener(new MouseAdapter(){
              public void mouseClicked(MouseEvent e) { 
                 f.show();
                 if (e.getButton() == MouseEvent.BUTTON3) 
                 { 
                 //   System.out.println("2DFSRF); 
                 } 

              }
           }
       );
        
           
      }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(backgr, 230, 80, this);
        g.drawImage(bar, p1x, p1y, this);
 
        System.out.println("ZEICHNE! "+p1x);
        
     }
   
    public static void main( String args[] ) {
    Test t = new Test();
    f = new JFrame();
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      f.setSize ( 800, 574 );
        JPanel p = new JPanel();       
        BorderLayout layout = new BorderLayout();
      
        p.setLayout ( layout );
        p.add ( new Test() );
       
        p.setVisible( true );
        p.addKeyListener(new Keyboard());
        p.setFocusable ( true );
        
        f.getContentPane().add ( p );
        f.setVisible( true );
     //   f.addKeyListener(new Keyboard());
 //       f.repaint();
    
        }
   

    public static int p1x = 230;
    public static int p1y = 80;
    
}
```


```
public class Keyboard implements KeyListener {   
   
   String aktion="nix";


public void keyTyped(KeyEvent e) {}
   
public void keyReleased(KeyEvent e){}

public void keyPressed(KeyEvent e) {
   int pressed=e.getKeyCode();

   if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
   {
      aktion = "Oben";
      Test.p1x = Test.p1x + 5;
      System.out.println("WERT X-ACHSE: "+Test.p1x);

      Test.f.repaint();
   }
   if (e.getKeyCode() == KeyEvent.VK_LEFT)//40)
   {
      aktion = "Unten";
      Test.p1x = Test.p1x - 5;
      System.out.println("WERT X-ACHSE: "+Test.p1x);
      Test.f.repaint();
      
   }
   
   if (e.getKeyCode() == KeyEvent.VK_DOWN) 
   {
      aktion = "Oben";
      Test.p1y = Test.p1y + 5;
      System.out.println("WERT y-ACHSE: "+Test.p1y);

      Test.f.repaint();
   }
   if (e.getKeyCode() == KeyEvent.VK_UP)
   {
      aktion = "Unten";
      Test.p1y = Test.p1y - 5;
      System.out.println("WERT y-ACHSE: "+Test.p1y);
      Test.f.repaint();
      
   }
   
  
}

}
```

vielen Dank!


----------



## MarcoBehnke (14. Aug 2007)

wenn ich dich richtig verstanden habe, dass ist JFRame f das Fenster was Du bei Klick öffnen möchtest. Deshalb macht es keinen Sinn einen Listener darauf zu legen, weil da ja möchtest, dass dieser das Fenster öffnet.

Also muss der Listener auf die Komponente, die das Bild enthält, das ist Test extends JPanel, also this


----------



## --- (14. Aug 2007)

Sorry, soweit bin ich noch gar nicht.
Das Image liegt auf dem JFrame f. Bis jetzt versuche ich nur, dass überhaupt was passiert. Wenn ich auf das image klicke, soll einfach nur was ausgegeben werden, mit System.out.println.

Bis jetzt erscheint die Ausgabe, egal wo ich auf den Frame klicke.


```
this.addMouseListener(new MouseAdapter(){
              public void mouseClicked(MouseEvent e) { 
                 f.show();
                System.out.println("2DFSRF); 
                 }
           }
       );
```
 Aber ich möchte ja nur bei Klick auf das Image(nur wenige Pixel gross) das Ereignis Click abfangen.

 this.addMouseListener(new MouseAdapter(){
              public void mouseClicked(MouseEvent e) { 
                 f.show(); //??
                 if (e.getButton() == MouseEvent.BUTTON3)  //hier statt Button mein Image
                 { 
                   System.out.println("2DFSRF); 
                 } 

              }
           }
       );

Kannst Du mir da weiterhelfen, ich hoffe ich hab mich jetzt verständlicher ausgedrückt.


----------



## MarcoBehnke (14. Aug 2007)

ja, aus dem MouseEvent musst due die Koordinaten des Klicks auslesen und schauen, ob der Klick in den Koordinaten des Bildes liegt.


----------



## --- (14. Aug 2007)

die Koordinaten des Klicks sind einfach zu ermitteln. Beim image weis ich nicht wie, ich will ja nicht die Koordinaten, sondern die Zeichenfläche. Es wäre ja Zufall, wenn ich pixelgenau das image treffen würde.

mein Versuch, würde ja nur funktionieren, wenn ich genau auf die Koordinaten klicke


```
(e.getX () == bar.getMinX () || e.getY () == bar.getMinY ())
```

Hast Du ne Idee? Ein Array mit Koordinaten der Vertices und dann schaun, ob der Klick in diesem Wertebereich liegt?
Oder gehts auch einfacher?

Nochmals vielen Dank!


----------

