当前位置: 首页 > 知识库问答 >
问题:

无法使用GridBagLayout将JLabels替换为其他JLabels

范文昌
2023-03-14

我有一个通过GridBagLayout布局管理器显示4x4方格的程序。显示16个JLabel,它们都包含一个square.gif。当点击其中一个矩形时,它应该被替换为包含图像(例如帽子)的JLabel。因此,图像代替了被点击的矩形。

public void displayGrid() {


    c.gridx = 0;
    c.gridy = 0;

    try {
        squareImage = ImageIO.read(this.getClass().getResource("stimulus(0).gif"));  //line 37

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    JLabel squareLabel = new JLabel(new ImageIcon(squareImage));

    for(int i = 0; i < 16; i++){
        c.gridx = i % 4;
        c.gridy = i / 4;
        squareLabel = new JLabel(new ImageIcon(squareImage));
        squareLabels[i] = squareLabel;
        panel.add(squareLabels[i], c);
        squareLabels[i].addMouseListener(this);

        System.out.println(c.gridx + "" + c.gridy);

    }

    panel.validate();

}

public void mousePressed(MouseEvent e) {

    for(int i = 0; i < squareLabels.length; i++){
        if(e.getSource() == squareLabels[i]){
            //JLabel removedLabel = squareLabels[i];
            c.gridx = (i/4);
            c.gridy = (i%4);
            panel.remove(squareLabels[i]);
            panel.revalidate();
            panel.repaint();
            panel.add(stimuliLabels[0], c);
            panel.validate();

        }
    }

}

在mousePressed()方法中,我尝试编写代码来确定所按下的JLabel,获取该JLabel的GridBagConstraints,删除所单击的JLabel,然后用具有给定GridBagConstraints的新JLabel替换该JLabel。但是,正如我已经说过的,程序没有按计划运行,我也不知道为什么。

谢谢你花时间读这篇文章。如有任何帮助,我们将不胜感激。

共有1个答案

秦楚
2023-03-14

为什么要交换JLabels?JLabels是用来保存图标的,通常是ImageIcons,如果您想交换图像,最好将JLabels留在原地,只需交换它显示的ImageIcon,这可以通过调用seticon(...)轻松完成。这比你想要做的要容易得多,而且这和库一起工作,而不是和你想要做的相反。

public void mousePressed(MouseEvent e) {
    // assuming that only JLabels are given this MouseListener:
    JLabel label = (JLabel) e.getSource();
    label.setIcon(desiredNewIcon);
}

例如,从我对一个类似问题的回答来看:

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 java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class RandomChessMen extends JPanel {
   // for this example I get a sprite sheet that holds several sprite images in it
   // the images can be found here: https://stackoverflow.com/questions/19209650
   private static final String IMAGE_PATH = "http://i.stack.imgur.com/memI0.png";
   private static final int LABEL_COUNT = 2;
   private static final int ICON_COLUMNS = 6;
   private Random random = new Random();

   public RandomChessMen() throws IOException {
      URL url = new URL(IMAGE_PATH);
      BufferedImage largeImg = ImageIO.read(url);
      setLayout(new GridLayout(1, 0));

      // break down large image into its constituent sprites and place into ArrayList<Icon>
      int w = largeImg.getWidth() / ICON_COLUMNS;
      int h = largeImg.getHeight() / LABEL_COUNT;
      for (int i = 0; i < LABEL_COUNT; i++) {
         final List<Icon> iconList = new ArrayList<>();
         int y = (i * largeImg.getHeight()) / LABEL_COUNT;
         // get 6 icons out of large image
         for (int j = 0; j < ICON_COLUMNS; j++) {
            int x = (j * largeImg.getWidth()) / ICON_COLUMNS;
            // get subImage
            BufferedImage subImg = largeImg.getSubimage(x, y, w, h);
            // create ImageIcon and add to list
            iconList.add(new ImageIcon(subImg));
         }

         // create JLabel
         final JLabel label = new JLabel("", SwingConstants.CENTER);
         int eb = 40;
         label.setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));

         // get random index for iconList
         int randomIndex = random.nextInt(iconList.size());
         Icon icon = iconList.get(randomIndex); // use index to get random Icon
         label.setIcon(icon); // set label's icon
         label.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
               Icon secondIcon = label.getIcon();
               // so we don't repeat icons
               while (label.getIcon() == secondIcon) {
                  int randomIndex = random.nextInt(iconList.size());
                  secondIcon = iconList.get(randomIndex);
               }
               label.setIcon(secondIcon);
            }
         });
         // add to GUI
         add(label);
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("RandomImages");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      try {
         frame.getContentPane().add(new RandomChessMen());
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
 类似资料:
  • 我想用相邻列中的值替换一列中的空值,例如,如果我 我希望它是: 尝试过 但没有工作,它说值应该是浮点数、int、长、字符串或判决 有什么想法吗?

  • 我有一种方法,可以按照班级团队中的国家对数据库中的数据进行排序。Hibernate在列表中返回我的数据 我的错误日志: 我的冠军联赛课程: 我的班级: }

  • 我的Androidanifest.xml文件是这样的 我正在使用build。渐变版 build.gradle(APP)文件是这样的 但是它总是显示这个警告在Androidanifest.xml文件,如何解决这个警告? 问题: > 警告是关于什么的? 我该怎么修?

  • 问题内容: 我需要一个易于使用的示例库,用于将NSObjects转换为JSON并再次返回,我在网上发现了大量用于解析JSon的解析示例,但是在使用SBJSON将NSObject转换为JSON时并不过分,任何人都有不错的教程或将NSObject转换为JSON的示例代码? 问题答案: 使用,将对象转换为JSON字符串,您必须重写方法。像下面这样 .h文件, 在实施文件中, 为了从JSON字符串中获取对

  • 问题内容: 任何人都可以解决此问题: Windows 10笔记本电脑上的SQL Server Management Studio 2016 CTP3(13.0.900.73) 对象资源管理器>服务器>数据库>数据库 右键单击-属性 我没有显示“数据库属性”对话框,而是显示了以下弹出窗口: 标题:Microsoft SQL Server Management Studio 无法显示请求的对话框。 附