当前位置: 首页 > 面试题库 >

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

庾和昶
2023-03-14
问题内容

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

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

问题答案:

如果将MouseListener直接添加到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();
   }

}


 类似资料:
  • 我创建了一个包含三个项目的菜单:menu1、menu2、Menu3。 我希望能够单击菜单内的每个按钮,并显示相关的容器。 这已经管用了。 我似乎无法使相关的在再次单击按钮时隐藏起来。 我的代码: null null

  • 问题内容: Java可以显示png,jpg和其他图片格式,但是我必须通过获取文件路径在JLable中显示bmp文件。 ImageIcon支持典型图像。 在我正在工作的项目中,我无法打开bmp文件并以jpg格式存储同一文件,因为我不允许在运行时存储某些内容。我只能将图像保存在内存中。但是我不知道该怎么做。 我怎样才能显示在 ? 谢谢 问题答案: 我发现一些用Java 1.5编写的类,但是您可以轻松更

  • 下面是我的代码,谁能给出一个更好的方法吗? WebElement tasktable=driver.findElement(by.xpath(“/html/body/div[2]/div[2]/div/div[3]/div/div[2]/div/div[3]/div/div[2]/div/div[3]/div/div/div[3]/div/div/div[2]/div/div/table/tbod

  • 问题内容: 在任何人建议使用HTML之前,我都会在后面解释为什么这不是一种选择。我有一个表,其中包含带有文本单元格的列。我需要能够突出显示每个单元格中的一些文本。因此,例如,如果该单元格包含“ cat foo dog”,我可能要突出显示foo。 我当前的方法是使用一个自定义TableCellRenderer,它将html放入要呈现的JLabel组件中,并且效果很好。然后我注意到,当单元格中的文本变

  • 试图查找包含data-qa属性的按钮。尝试用以下方案处理它:

  • 问题内容: 我有一个位于JButton顶部的JLabel,但它不会显示在顶部。注释掉JButton的代码后,将显示JLabel,这意味着它在其中,但在底部。有没有办法在JButton的顶部显示JLabel? 任何帮助都是极好的。谢谢! 编辑: 为了澄清起见,我需要在游戏中使用该按钮,单击该按钮时,按钮上方会显示一个JLabel,以显示添加的“得分”。在我的游戏中,JLabel将比JButton小,