簡體   English   中英

將JLabel添加到MouseListener

[英]Add JLabel to MouseListener

第一次海報在這里!

我正在使用Java Photo Viewer Gallery 我想將所有標簽從ArrayList添加到MouseListener 因此,我可以在新的大窗口中打開用戶單擊的圖片。

我有一個文件選擇器,用戶可以在其中選擇i張照片。 我將它們縮放並放入:

縮放的ArrayList = new ArrayList();

錯誤:類型為Component的方法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添加標簽。 您將MouseListener添加到標簽。 您沒有實現MouseListener接口,所以會遇到編譯錯誤。 您需要實現所有方法(mousePressed,mouseReleased ...)。

閱讀Swing教程中有關如何編寫MouseListener的部分,以獲取工作示例。

另外,一旦使MouseListener正常工作,就無需創建兩個標簽。 基本代碼可能類似於:

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

希望對您有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM