Наложение изображений на GridLayout в Java - PullRequest
3 голосов
/ 03 июня 2011

Можно ли иметь один набор изображений в качестве "фонового изображения" разметки сетки, а другие изображения в качестве "содержимого" разметки сетки?

Если нет, каков наилучший способ сделать это?

Ответы [ 2 ]

6 голосов
/ 03 июня 2011

Да, это возможно.Сделайте один фон JPanel, который содержит GridLayout.Это можно сделать, нарисовав изображение в методе JPCanel paintComponent.Если вы хотите, чтобы ячейки сетки отображали фоновое изображение, обязательно установите для их непрозрачного свойства значение 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();
         }
      });
   }
}
4 голосов
/ 03 июня 2011

Можно ли изменить размер фонового изображения вместе с остальными?

Да, drawImage() может масштабироваться до полного размера контейнера, как показано здесь .

Можно ли установить фоновое изображение каждой ячейки ?

Да, getSubimage() полезен в этом контексте, как показано здесь .

...