2017-01-28 4 views
-1

Я создаю PhotoViewer. Я хочу, чтобы получить путь к ImageIcon, который отображается в JLabel. Поэтому я создал MouseListener и FileChooser. Я потратил много часов, пытаясь решить эту проблему.Получение пути от ImageIcon, который отображается на JLabel

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

Здесь я хочу дать каждому Лейбл, который неоспоримым создал имя, которое я, так что я могу GetName() позже и задать конкретный ярлык, который ImageIcon она содержит и его путь.

У меня есть три ArrayLists:

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

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

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

Теперь событие mouseClicked должны дать мне путь к ImageIcon на этикетке, которая была нажата.

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

После этого создается рамка с параметром 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 

    } 

} 
+1

1. В чем проблема? 2. Почему вам даже нужен путь? Вы можете просто передать фактический значок. Если вам нужна дополнительная помощь, опубликуйте надлежащую [mcve](), которая демонстрирует проблему (а не ваше приложение). Таким образом, «MCVE» будет состоять из JFrame с JLabel. Затем вы добавляете MouseListener в JLabel. Весь другой код не имеет отношения к вашей заявленной проблеме. – camickr

+0

Проблема в том, что я не могу получить значок, и я масштабировал изображения и полноразмерные изображения. Если я щелкнул ImageIcon (или, лучше, его ярлык), я хочу получить изображение полного размера, а не масштабированное, чтобы отображать больше. Итак, я решил, что мне нужно предоставить каждому ярлыку переменную Integer и масштабировать и не масштабировать ArrayLists, а затем получить полноразмерное изображение. – StackOverFlowUser1997

+0

Вы можете использовать «HashMap», чтобы связать изображение с файлом; вы можете использовать 'JLabel # setName' /' JLabel # getName'; вы можете использовать 'JLabel # putClientProperty' /' JLabel # getClientProperty' – MadProgrammer

ответ

3

Есть несколько возможных подходов к этому, ни один из которых включает в себя:

Получение путь от ImageIcon ..

См What is the XY problem?

В одну сторону:

File[] f = chooser.getSelectedFiles(); 

Объявление File[] f как атрибут класса, поэтому оно доступно позже. В щелчке найдите исходный компонент, получите значок изображения и получите изображение.

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

Тогда:

int index = scaled.get(img); 

& файл:

File file = f[index]; 
Смежные вопросы