Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JLabel上显示的图像图标获取路径_Java_Swing_File_Path_Imageicon - Fatal编程技术网

Java 从JLabel上显示的图像图标获取路径

Java 从JLabel上显示的图像图标获取路径,java,swing,file,path,imageicon,Java,Swing,File,Path,Imageicon,我正在制作一个照片查看器。我希望能够获得显示在JLabel上的ImageIcon的路径。因此,我创建了一个MouseListener和一个FileChooser。我花了很多时间试图解决这个问题 for (int i=0; i< scaled.size(); i++){ labels.add(i, new JLabel(new ImageIcon(scaled.get(i)))); } 然后,使用choosen图片路径的Constructot参数创建一个帧。我将在一个单独的框架中显示它 完

我正在制作一个照片查看器。我希望能够获得显示在JLabel上的ImageIcon的路径。因此,我创建了一个MouseListener和一个FileChooser。我花了很多时间试图解决这个问题

for (int i=0; i< scaled.size(); i++){
labels.add(i, new JLabel(new ImageIcon(scaled.get(i))));
}
然后,使用choosen图片路径的Constructot参数创建一个帧。我将在一个单独的框架中显示它

完整代码:

import java.awt.BorderLayout;
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();    

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

    public void method1(){
        JLabel test = labels.get(0);
        System.out.println(test.getName());     
    }


    ArrayList<JLabel> labels = new ArrayList<JLabel>();

    ArrayList<ImageIcon> AL = new ArrayList<ImageIcon>();

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

    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);
        menuitem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event){

                        int result = chooser.showOpenDialog(null);

                        if(result == JFileChooser.APPROVE_OPTION) {

                            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){
                                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++){
                                labels.add(i, new JLabel(new ImageIcon(scaled.get(i))));
                            }

                            for (JLabel x : labels){
                                x.addMouseListener(ImageViewerFrame.this);
                            }

                            for (int i=0; i< scaled.size(); i++){
                                //panel.add(new JLabel(i), (new ImageIcon (scaled.get(i))));                        
                                panel.add(labels.get(i));

                            }
                                                                }
                                    }
                            });

    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        System.out.println(arg0.getSource().getName());
        int a = arg0.getSource().getName();
        getImageIcon.labels.get(a);
        CreateFrame(arg0.getSource().getDescription());
    }

    private void CreateFrame() {
        JFrame frame2 = new JFrame("Test");
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel3 = new JPanel();
        JButton next = new JButton("Next");
        JButton previous = new JButton ("Previous");
        JButton diashow = new JButton ("Diashow");
        panel3.add(next);
        panel3.add(previous);
        panel3.add(diashow);
        panel3.setVisible(true);
        frame2.setVisible(true);
        frame2.add(panel3);
    }



    private void CreateFrame(String s) {
        JFrame frame2 = new JFrame("Test");
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel3 = new JPanel();
        JButton next = new JButton("Next");
        JButton previous = new JButton ("Previous");
        JButton diashow = new JButton ("Diashow");
        panel3.add(next);
        panel3.add(previous);
        panel3.add(diashow);
        panel3.setVisible(true);
        frame2.setVisible(true);
        frame2.add(panel3);
        panel3.add(new JLabel(s));

    }

    @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

    }

}

对此有多种可能的方法,其中没有一种涉及:

正在从图像图标获取路径

单向:

File[] f = chooser.getSelectedFiles(); 
将文件[]f声明为类的属性,以便以后可以访问。单击,找到源组件,获取图像图标,然后从中获取图像

JLabel label = (JLabel)mouseEvent.getSource();
ImageIcon imageIcon = (ImageIcon)label.getIcon();
Image img = imageIcon.getImage();
然后:

&该文件是:

File file = f[index]; 

1.有什么问题?2.你为什么需要这条路?您只需传入实际图标即可。如果你需要更多的帮助,那就发布一篇适当的文章来说明问题,而不是你的应用程序。因此,MCVE将由一个JFrame和一个JLabel组成。然后将鼠标侦听器添加到JLabel。所有其他代码都与您所述的问题无关。问题是我无法获取图标,并且我有缩放图像和全尺寸图像。如果我点击一个图像图标或更好的标签,我希望得到全尺寸的图像,而不是缩放的图像,以便显示更大的图像。所以我想我需要给每个标签一个整数变量,并有缩放和不缩放的ArrayList,然后才能得到完整大小的图像;您可以使用JLabelsetName/JLabelgetName;您可以使用JLabelputClientProperty/jlabelgetclientproperty,我将尝试删除尽可能多与问题无关的代码,但我理解问题会进一步发展,我无法最小化,因为这肯定不是一个简单的语法Error@MadProgrammer我将阅读HashMaps,听起来可能会有所帮助,谢谢!
JLabel label = (JLabel)mouseEvent.getSource();
ImageIcon imageIcon = (ImageIcon)label.getIcon();
Image img = imageIcon.getImage();
int index = scaled.get(img); 
File file = f[index];