Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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并从中显示ImageIcon?_Java_Swing_Jlabel_Mouselistener_Imageicon - Fatal编程技术网

Java 如何找到已单击的JLabel并从中显示ImageIcon?

Java 如何找到已单击的JLabel并从中显示ImageIcon?,java,swing,jlabel,mouselistener,imageicon,Java,Swing,Jlabel,Mouselistener,Imageicon,这是我的密码。我想知道单击了哪个l,然后在新的框架中显示该图像图标 e.getSource()不工作 final JFrame shirts = new JFrame("T-shirts"); JPanel panel = new JPanel(new GridLayout(4, 4, 3, 3)); for (int i = 1; i < 13; i++) { l = new JLabel(new ImageIcon("T-shirts/"+i+".jpg"), JLabel.

这是我的密码。我想知道单击了哪个
l
,然后在新的框架中显示该图像图标

e.getSource()不工作

final JFrame shirts = new JFrame("T-shirts");
JPanel panel = new JPanel(new GridLayout(4, 4, 3, 3));

for (int i = 1; i < 13; i++) {
    l = new JLabel(new ImageIcon("T-shirts/"+i+".jpg"), JLabel.CENTER);
    l.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
    l.setFont(l.getFont().deriveFont(20f));
    panel.add(l);
}//end of for loop

panel.addMouseListener(new MouseAdapter(){  
    public void mouseClicked(MouseEvent e)  
    {
        sizes = new JFrame("Shopping");
        sizes.setVisible(true);
        sizes.setSize(500, 500);
        sizes.setLocation(100,200);
        shirts.dispose();
        if(e.getSource()==l){//FIX
            sizes.add(l);
        }//end of if
    }  
});

shirts.setContentPane(panel);
shirts.setSize(1000, 1000);
shirts.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
shirts.setVisible(true);
最终JFrame衬衫=新JFrame(“T恤”);
JPanel面板=新JPanel(新网格布局(4,4,3,3));
对于(int i=1;i<13;i++){
l=新的JLabel(新图像图标(“T-shirts/”+i+“.jpg”)、JLabel.CENTER;
l、 setBordOrder(BorderFactory.createBevelOrder(BevelOrder.RAISED));
l、 setFont(l.getFont().deriveFont(20f));
小组.添加(l);
}//循环结束
panel.addMouseListener(新的MouseAdapter(){
公共无效mouseClicked(MouseEvent e)
{
尺寸=新JFrame(“购物”);
大小。设置为可见(真);
尺寸。设置尺寸(500500);
尺寸。设置位置(100200);
衬衫。处理();
如果(e.getSource()==l){//FIX
尺寸。增加(l);
}//if结束
}  
});
衬衫.套装内容窗格(面板);
衬衫.套装尺寸(10001000);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
衬衫。可见(真实);
您试过这个吗

public void mouseClicked(MouseEvent e)  
{

       sizes = new JFrame("Shopping");
       sizes.add(l);
       sizes.setVisible(true);
       sizes.setSize(500, 500);
       sizes.setLocation(100,200);
       shirts.dispose();

//Remove the "e.getSource()" part.


}  
它将自动显示图像,因为您正在为其指定图像名称,与添加到新JFrame的图像位于同一段中


让我知道结果

如果您将鼠标侦听器直接添加到JLabel,那么您可以在JOptionPane中轻松显示按下的标签图标:

@Override
public void mousePressed(MouseEvent mEvt) {
   JLabel label = (JLabel) mEvt.getSource();
   Icon icon = label.getIcon();
   JOptionPane.showMessageDialog(label, icon);
}
例如:

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.*;

public class FooMouseListener extends JPanel {
   private GetImages getImages;

   public FooMouseListener() throws IOException {
      getImages = new GetImages();
      setLayout(new GridLayout(GetImages.SPRITE_ROWS, GetImages.SPRITE_COLS));
      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      for (int i = 0; i < GetImages.SPRITE_CELLS; i++) {
         JLabel label = new JLabel(getImages.getIcon(i));
         add(label);
         label.addMouseListener(myMouseAdapter);
      }
   }

   private class MyMouseAdapter extends MouseAdapter {
      @Override
      public void mousePressed(MouseEvent e) {
         JLabel label = (JLabel) e.getSource();
         Icon icon = label.getIcon();
         JOptionPane.showMessageDialog(label, icon, "Selected Icon", JOptionPane.PLAIN_MESSAGE);
      }
   }

   private static void createAndShowGui() {
      FooMouseListener mainPanel = null;
      try {
         mainPanel = new FooMouseListener();
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }

      JFrame frame = new JFrame("FooMouseListener");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class GetImages {
   private static final String SPRITE_PATH = "http://th02.deviantart.net/"
         + "fs70/PRE/i/2011/169/0/8/blue_player_sprite_sheet_by_resetado-d3j7zba.png";
   public static final int SPRITE_ROWS = 6;
   public static final int SPRITE_COLS = 6;
   public static final int SPRITE_CELLS = SPRITE_COLS * SPRITE_ROWS;

   private List<Icon> iconList = new ArrayList<>();

   public GetImages() throws IOException {
      URL imgUrl = new URL(SPRITE_PATH);
      BufferedImage mainImage = ImageIO.read(imgUrl);

      for (int i = 0; i < SPRITE_CELLS; i++) {
         int row = i / SPRITE_COLS;
         int col = i % SPRITE_COLS;
         int x = (int) (((double) mainImage.getWidth() * col) / SPRITE_COLS);
         int y = (int) ((double) (mainImage.getHeight() * row) / SPRITE_ROWS);
         int w = (int) ((double) mainImage.getWidth() / SPRITE_COLS);
         int h = (int) ((double) mainImage.getHeight() / SPRITE_ROWS);
         BufferedImage img = mainImage.getSubimage(x, y, w, h);
         ImageIcon icon = new ImageIcon(img);
         iconList.add(icon);
      }
   }

   // get the Icon from the List at index position
   public Icon getIcon(int index) {
      if (index < 0 || index >= iconList.size()) {
         throw new ArrayIndexOutOfBoundsException(index);
      }

      return iconList.get(index);
   }

   public int getIconListSize() {
      return iconList.size();
   }

}
导入java.awt.GridLayout;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.image.buffereImage;
导入java.io.IOException;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类FooMouseListener扩展了JPanel{
私有获取图像获取图像;
public FooMouseListener()引发IOException{
getImages=新的getImages();
setLayout(新的GridLayout(GetImages.SPRITE_行,GetImages.SPRITE_列));
MyMouseAdapter MyMouseAdapter=新的MyMouseAdapter();
对于(int i=0;i=iconList.size()){
将新的ArrayIndex抛出BoundsException(索引);
}
返回iconList.get(索引);
}
public int getIconListSize(){
返回iconList.size();
}
}

为获得更好的用户体验,请更改1)按钮标签(可能未装饰)。2) 动作侦听器的鼠标侦听器(同时响应鼠标和键盘)。3) 对话框或选项窗格的框架。请参见“是”,它仅显示添加到JLabel的最后一个图像,而不显示单击的图像。确定然后,另一种方法是将每个JLabel的名称设置为图像的路径。在这里,每次显示后,您都会得到名称(“l.get text()”)。。。这会起作用的。我该怎么做呢?好的,在for循环中创建标签时,不要说“new ImageIcon”。。只要写上“T恤/”+i+“.jpg”。。。然后在mouselistener上创建另一个JLabel,它将获取上一个标签的文本,并将其用作ImageIcon的路径,并将此新标签添加到下一帧。哦,对了,您希望将标签显示为图像,然后在下一帧上使用相同的图像。好的,在这种情况下,改变你正在做的事情。但是创建我们前面讨论过的标签数组。创建2个JLabel,一个将与图像一起立即显示,另一个将包含路径的文本并存储在数组中。然后在代码之外创建鼠标侦听器。使用(此)将鼠标侦听器添加到标签。然后在鼠标侦听器的方法中有一个if语句,它将检查单击的源代码