Ben: actionperformed für mehrere Objekte

Hallo zusammen

Ich hänge gerade fest und weiss nicht wie man so ein Problem löst. Es geht um folgendes:

Ich erstelle in meinem Layout JLabels mit Bildern aus einem Ordner. Zusätzlich habe ich ein Objekt welches nach einem Klick auf das verkleinerte Bild noch eine Grossansicht des Bildes öffnet. Mein Problem ist jetzt, wie ich beim Klick sehen kann, auf welche Komponente geklickt wurde. Sprich ich müsste wissen, die wievielte Komponente des Panels den Event ausgelöst hat, damit ich nur eine mouseClicked-Methode brauche, welche dann anhand des Komponenten-Indexes den richtigen Bildpfad aus meiner List von Bildern holt und die Grossansicht ansteuert.

Referenz auf die Labels habe ich übrigens keine mehr. Gibt es eine Möglichkeit das so zu machen oder bin ich total falsch gewickelt? Oder muss ich tatsächlich die Referenz von jedem Label in einer Instanzvariablen, bzw. natürlich einer List, speichern?

Danke & Gruss
Ben

  1. Hmm... der JButton kennt ActionCommands, mit denen sowas recht einfach zu bewerkstelligen ist, etwas in der Richtung hab' ich beim JLabel gerade auf die Schnelle nicht gefunden.

    Allerdings kannst du die Objekte per .getSource() und .equals() vergleichen - so kannst du feststellen, welches Label geklickt wurde. Ein bisschen umständlich vielleicht, aber was eleganteres fällt mir gerade nicht ein.

    Beispiel:

      
    import javax.swing.*;  
    import java.awt.*;  
    import java.awt.event.*;  
      
    public class Klasse extends JFrame  
    {  
     private JLabel[] labels;  
      
     public static void main(String[] args)  
     {  
      new Klasse();  
     }  
      
     public Klasse()  
     {  
      super("Test");  
      
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
      this.setSize(640,480);  
      this.setLocationRelativeTo(null);  
      
      Container cp = this.getContentPane();  
      cp.setLayout(new GridLayout(10,1));  
      
      LabelListener ll = new LabelListener();  
      
      this.labels = new JLabel[4];  
      
      for(int i=0; i<this.labels.length; i++)  
      {  
       this.labels[i] = new JLabel("tollesLabel");  
       this.labels[i].addMouseListener(ll);  
       cp.add(this.labels[i]);  
      }  
      
      this.setVisible(true);  
     }  
      
      
      private class LabelListener implements MouseListener  
      {  
       public void mouseClicked(MouseEvent me)  
       {  
        if(Klasse.this.labels[0].equals( (JLabel)me.getSource()))  
        {  
         System.out.println("Label 1 geklickt");  
        }  
      
        if(Klasse.this.labels[1].equals( (JLabel)me.getSource()))  
        {  
         System.out.println("Label 2 geklickt");  
        }  
      
        if(Klasse.this.labels[2].equals( (JLabel)me.getSource()))  
        {  
         System.out.println("Label 3 geklickt");  
        }  
      
        if(Klasse.this.labels[3].equals( (JLabel)me.getSource()))  
        {  
         System.out.println("Label 4 geklickt");  
        }  
      
      
       }  
      
       public void mousePressed(MouseEvent me)  
       {  
      
       }  
      
       public void mouseExited(MouseEvent me)  
       {  
      
       }  
      
       public void mouseEntered(MouseEvent me)  
       {  
      
       }  
      
       public void mouseReleased(MouseEvent me)  
       {  
      
       }  
      
      }  
      
     }  
    
    
    1. Hallo!

      Danke, es funktioniert nun.

      Ich hab es nun so gemacht, dass ich alle Komponenten meines Panels in einer Schleife durchgehe, das funktioniert tiptop.

      Gruss Ben

  2. Hallo Ben,

    Sprich ich müsste wissen, die wievielte Komponente des Panels den Event ausgelöst hat

    Versuchs mal mit ComponentEvent.getComponent(). Das sollte Dir die Komponente zurückgeben. MouseEvent erbt auch von ComponentEvent, wie die meisten anderen Event-Klassen.

    Grüße

    Daniel