【问题标题】:Overlay images on a GridLayout in Java在 Java 中的 GridLayout 上叠加图像
【发布时间】:2011-09-07 12:34:22
【问题描述】:

是否可以将一组图像作为网格布局的“背景图像”,而将其他图像作为网格布局的“内容”?

如果没有,最好的方法是什么?

【问题讨论】:

  • 气垫船是对的。要在 GridLayout 的单元格中添加图像,您可以添加 new JLabel(null, image)
  • 请参阅编辑发布。

标签: java image swing grid-layout


【解决方案1】:

是的,这当然是可能的。将其中之一作为包含 GridLayout 的 JPanel 的背景。这可以通过在 JPanel 的 paintComponent 方法中绘制图像来完成。如果您希望网格的单元格显示背景图像,请确保将其 opaque 属性设置为 false。如果它们是 JLabels,默认情况下已经完成。

编辑:例如:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class OverLayImages extends JPanel {
   public static final String BACKGROUND_URL = "http://duke.kenai.com/misc/Bullfight.jpg";
   public static final String CELL_URL = "http://duke.kenai.com/iconSized/penduke-transparent.gif";
   private static final int ROWS = 3;
   private static final int COLS = 4;
   private BufferedImage backgroundImage;
   private BufferedImage cellImage;

   public OverLayImages() throws MalformedURLException, IOException {
      backgroundImage = ImageIO.read(new URL(BACKGROUND_URL));
      cellImage = ImageIO.read(new URL(CELL_URL));
      ImageIcon cellIcon = new ImageIcon(cellImage);
      setBackground(Color.white);

      setPreferredSize(new Dimension(backgroundImage.getWidth(), backgroundImage.getHeight()));

      setLayout(new GridLayout(ROWS, COLS));
      for (int i = 0; i < ROWS; i++) {
         for (int j = 0; j < COLS; j++) {
            JLabel label = new JLabel(cellIcon);
            add(label);
         }
      }
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (backgroundImage != null) {
         g.drawImage(backgroundImage, 0, 0, null);
      }
   }

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

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

【讨论】:

  • 你也可以修改hgapvgap
  • 是否可以让背景图片与其他图片一起调整大小?或者是否可以设置每个CELL的背景图片?
  • @Johannes:是的,是的;我已经在一个相邻的答案中详细说明了。
【解决方案2】:

是否可以让背景图片与其他图片一起调整大小?

是的,drawImage() 可以缩放到容器的全尺寸,如图所示here

是否可以设置每个cell的背景图片?

是的,getSubimage() 在这种情况下很有帮助,如 here 所示。

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2023-03-07
    • 2014-02-19
    • 2014-11-14
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多