将 JLabel 添加到 MouseListener



第一次海报在这里!

我正在开发一个Java照片查看器库。我想将所有标签从 ArrayList 添加到 MouseListener。所以我可以在一个新的大窗口中打开用户点击的图片。

有一个文件选择器,用户可以在其中选择我数量的图片。我缩放它们并将它们放在一个:

ArrayList

scaled = new ArrayList();

错误:组件类型中的方法 addMouseListener(MouseListener) 不适用于参数 (new ActionListener(){})

我尝试使用

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
                        }

完整的代码是:

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
    }
}

它不会让我将 JLabel l 添加到 MouseListener

首先,您不要向鼠标侦听器添加标签。将鼠标侦听器添加到标签。您没有实现 MouseListener 接口,因此出现编译错误。您需要实现所有方法(鼠标按下,鼠标释放...)。

阅读 Swing 教程中关于如何编写鼠标侦听器的部分,了解工作示例。

此外,一旦你让鼠标侦听器工作,你就不需要创建两个标签。基本代码可能如下所示:

JLabel l = new JLabel(new ImageIcon(scaled.get(i)));
label.addMouseListener(this); //<- Compiler Error
panel.add( label );

最后,您可能需要考虑使用 JList 来显示图标。它更有效,因为它只是渲染图像。然后,您可以使用 ListSelectionListener 在选择图像时进行处理。有关详细信息,请阅读 Swing 教程中有关如何使用列表的部分。

我会使用一个数组来存储所有鼠标信息。例:

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();
    }
}

mouse数组将是:

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

并且应该很容易检查一个点(鼠标)是否在矩形(标签)上。如果您不知道如何获取标签的位置,只需使用此代码:

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

希望对您有所帮助!

最新更新