2017-01-28 3 views
0

1. Poster hier!Fügen Sie JLabel zu MouseListener hinzu

Ich arbeite an einem Java Photo Viewer Gallery. Ich möchte alle Labels aus einer ArrayList zu einem MouseListener hinzufügen. So kann ich das Bild öffnen, auf das der Benutzer in einem neuen großen Fenster geklickt hat.

Ich habe eine Dateiauswahl, wo der Benutzer i Anzahl der Bilder auswählen kann. Ich skalierte sie und legte sie in eine:

ArrayList skaliert = new ArrayList();

Fehler: Die Methode addMouseListener (Mouselistener) in der Art Komponente ist nicht anwendbar für die Argumente (neue Action() {})

I

for (int i=0; i< scaled.size(); i++){ 
         panel.add(new JLabel(new ImageIcon (scaled.get(i)))); 
         JLabel l = new JLabel(new ImageIcon(scaled.get(i))); 
         l.addMouseListener(this); //<- Compiler Error 

         } 

Der vollständige Code zu benutzen versucht:

import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.Label; 
import java.awt.List; 
import java.awt.event.*; 
import java.io.*; 
import java.util.ArrayList; 
import java.util.Arrays; 

import javax.swing.*; 




public class ImageViewer { 

    public static void main(String[] args) { 

     JFrame frame = new ImageViewerFrame(); 
     frame.setTitle("PhotoViewer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 



@SuppressWarnings("serial") 
class ImageViewerFrame extends JFrame implements MouseListener{ 
    JLabel label; 
    JFileChooser chooser; 
    JMenuBar menubar; 
    JMenu menu; 
    JMenuItem menuitem; 

    JPanel panel = new JPanel(); 
// JLabel l1= new JLabel("First"); 
// JLabel l2= new JLabel("Second"); 
// JLabel l3= new JLabel("Third"); 
// JLabel l4= new JLabel("Fourth"); 




    public ArrayList<File> images = new ArrayList <File>(); 

    public ImageViewerFrame() { 
     setSize(500,500); 

     panel.setLayout(new GridLayout(0,5)); 

     label = new JLabel(); 
     add(label); 
     add(panel); 
     JButton test = new JButton ("TEST"); 
     test.addMouseListener(this); 
     panel.add(test); 
     panel.setVisible(true); 
     chooser = new JFileChooser(); 
     chooser.setCurrentDirectory(new File(".")); 
     chooser.setMultiSelectionEnabled(true); 
     menubar = new JMenuBar(); 
     setJMenuBar(menubar); 

     menu = new JMenu("File"); 
     menubar.add(menu); 

     menuitem = new JMenuItem("Open"); 
     menu.add(menuitem); 
     ArrayList<ImageIcon> AL = new ArrayList<ImageIcon>(); 

     ArrayList<Image> scaled = new ArrayList<Image>(); 




     menuitem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event){ 

         int result = chooser.showOpenDialog(null); 

         if(result == JFileChooser.APPROVE_OPTION) { 

          //label.setIcon(new ImageIcon(name)); 

          File[] f = chooser.getSelectedFiles(); 

          for(int i=0; i< f.length; i++) 
          { 
           images.add(f[i]); 
           ImageIcon imageicon = new ImageIcon(f[i].toString()); 
           AL.add(imageicon); 

          }  

          for (ImageIcon x : AL){ 
           System.out.println(x); 
           Image image = x.getImage(); 
           Image newimg = image.getScaledInstance(120,120, java.awt.Image.SCALE_SMOOTH); 
           scaled.add(newimg); 
          } 


          for (int i=0; i< scaled.size(); i++){ 
           panel.add(new JLabel(new ImageIcon (scaled.get(i)))); 
           JLabel l = new JLabel(new ImageIcon(scaled.get(i))); 
           l.addMouseListener(this); 


          } 




                   } 
            } 
          }); 




    } 






    @Override 
    public void mouseClicked(MouseEvent arg0) { 


    } 







    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 







    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 







    @Override 
    public void mousePressed(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 







    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 
+0

Was ist das Problem, bitte? – user7185318

+0

Entschuldigung für die Unklarheit. Es lässt mich das JLabel l dem MouseListener nicht hinzufügen – StackOverFlowUser1997

+0

Versuchen Sie, eine innere Klasse für Ihren MouseListener zu schaffen, etwas wie MyMouseListener dann implementiert seine abtract Methoden. In Ihrer for-Schleife l.addMouseListener (new MyMouseListener()); Schauen Sie sich auch die Dokumentation von Oracle an: [MouseListener] (http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) –

Antwort

1

It wont let me add the JLabel l to the MouseListener

allererst Sie kein Etikett an einem Mouselistener hinzuzufügen. Sie fügen dem Label einen MouseListener hinzu. Sie haben die MouseListener-Schnittstelle nicht implementiert, sodass Sie den Kompilierungsfehler erhalten. Sie müssen alle Methoden implementieren (mousePressed, mouseReleased ...).

Lesen Sie den Abschnitt aus dem Swing-Tutorial zum Schreiben eines MouseListener für Arbeitsbeispiele.

Sobald Sie den MouseListener aktiviert haben, müssen Sie keine zwei Beschriftungen mehr erstellen. Der Basiscode könnte beispielsweise lauten:

Schließlich möchten Sie möglicherweise eine JList verwenden, um die Symbole anzuzeigen. Es ist effizienter, weil es nur die Bilder rendert. Dann können Sie einen ListSelectionListener verwenden, um die Verarbeitung durchzuführen, wenn ein Bild ausgewählt wird. Lesen Sie den Abschnitt aus dem Swing-Lernprogramm unter How to Use Lists, um weitere Informationen zu erhalten.

+0

mich korrigieren, wenn im falschen, aber es sagt: Klasse ImageViewerFrame erweitert JFrame implementiert Mouselistener so ich Mouselistener – StackOverFlowUser1997

+0

@ StackOverFlowUser1997 implementiert, die „this“ in Ihrem Code bezieht sich auf die Action Klasse, nicht die 'ImageViewerFrame' Klasse . Verwenden Sie "ImageViewerFrame.this" als Parameter. – camickr

+0

("ImageViewerFrame.this" als Parameter.) Sieht so gut aus. Ich teste noch .. Danke Wird zurück melden, wenn das Problem gelöst ist – StackOverFlowUser1997

0

Ich würde ein Array verwenden, um alle Mausinformationen zu speichern. Beispiel:

public class MyApp extends JFrame implements MouseListener, MouseWheelListener { 

    public int[] mouse=new int[5]; 

    public void mousePressed(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=1; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=1; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=1; 
     } 
    } 
    public void mouseClicked(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=3; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=3; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=3; 
     } 
    } 
    public void mouseReleased(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=2; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=2; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=2; 
     } 
    } 
    public void mouseEntered(MouseEvent m) { 
    } 
    public void mouseExited(MouseEvent m) { 
    } 
    public void mouseWheelMoved(MouseWheelEvent w) { 
     mouse[3]=w.getWheelRotation(); 
    } 
    public MyApp() { 
     super("MyApp"); 
     //Do your stuff here... 
     //... 
     //... 
     setTitle("Image Picker"); 
     requestFocus(); 
     addMouseListener(this); 
     addMouseWheelListener(this); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(1400,1000); 
     setResizable(true); 
     setVisible(true); 
     int gc=0; 
     Rectangle r; 
     while (true){ 
      try { 
      Thread.sleep(33); 
      } catch(InterruptedException bug) { 
      Thread.currentThread().interrupt(); 
      System.out.println(bug); 
      } 
      r=getComponents()[0].getBounds(); 
      gc=gc+1; 
      if (gc==500) { 
       System.gc(); 
       gc=0; 
      } 
      mouse[0]=MouseInfo.getPointerInfo().getLocation().x-getComponents()[0].getLocationOnScreen().x; 
      mouse[1]=MouseInfo.getPointerInfo().getLocation().y-getComponents()[0].getLocationOnScreen().y; 
      //Display labels 
     } 
    } 

    public static void main(String args[]){ 
     new MyApp(); 
    } 
} 

Die mouse Array wird:

mouse[0] - mouse x pos 
mouse[1] - mouse y pos 
mouse[2] - left mouse button 
mouse[3] - middle mouse button 
mouse[4] - right mouse button 
mouse[5] - mouse wheel rotation, 0 if none, else -n to n 

Und es sollte leicht zu überprüfen, wenn ein Punkt (die Maus) über ein Rechteck ist (das Etikett). Wenn Sie nicht wissen, wie die Positionen der Etiketten zu erhalten, verwenden Sie einfach diesen Code:

Rectangle r=getComponents()[1+n].getBounds(); 
//r.x, r.y, r.width, r.height 

Hoffe, dass es Ihnen hilft!

Verwandte Themen