JPanel大小没有变化

时间:2013-11-16 16:12:44

标签: java swing jpanel layout-manager

大家好我正在尝试用Java创建一个草稿游戏并使用JPanel来表示正方形,如果我要改变面板的大小我该怎么办呢?如果我使用布局管理器,方块不够大。目前我没有使用布局管理器来尝试更改大小,但尺寸似乎没有变化 - 只保持在1,1像素。

 private void createSquares(){
    for(int i = 0; i < 65; i++){
        squares[i] = new JPanel();
        squares[i].setLayout(null);
        squares[i].setSize(20,20);
        board.add(squares[i]);
    }
}

1 个答案:

答案 0 :(得分:0)

您可以随时在线“借”一两张图片,并将其放入您的程序中。例如这段代码:

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

public class GetChessSquareImages {
   public static final String PATH_TO_SQUARES = "http://www.colourbox.com/preview/" +
        "4578561-622234-seamless-oak-square-chess-like-parquet-texture.jpg";
   private static final int IMG_SIDE_COUNT = 4;
   private static final double SCALE = 0.8;
   private Map<SquareColor, List<Icon>> squareColorMap = new HashMap<SquareColor, List<Icon>>(); 
   private Random random = new Random();

   public void downloadImages() throws IOException {
      URL lrgImgUrl = new URL(PATH_TO_SQUARES);
      BufferedImage largeImg = ImageIO.read(lrgImgUrl);

      int w = largeImg.getWidth() / IMG_SIDE_COUNT;
      int h = largeImg.getHeight() / IMG_SIDE_COUNT;
      for (int i = 0; i < IMG_SIDE_COUNT; i++) {
         int x = (i * largeImg.getWidth()) / IMG_SIDE_COUNT;
         for (int j = 0; j < IMG_SIDE_COUNT; j++) {
            if (j != 1 && j != 2) {
               int y = (j * largeImg.getHeight()) / IMG_SIDE_COUNT;
               extractSubImg(largeImg, i, j, x, y, w, h);
            }
         }
      }
   }

   private void extractSubImg(BufferedImage largeImg, 
         int i, int j, int x, int y, int w, int h) {
      Image subImg = largeImg.getSubimage(x, y, w, h);
      int width = (int) (w * SCALE);
      int height = (int) (h * SCALE);
      subImg = subImg.getScaledInstance(width, height, Image.SCALE_SMOOTH);
      List<Icon> iconList = null;
      if (i % 2 == j % 2) {
         iconList = squareColorMap.get(SquareColor.LIGHT);
         if (iconList == null) {
            iconList = new ArrayList<Icon>();
            squareColorMap.put(SquareColor.LIGHT, iconList);
         }
      } else {
         iconList = squareColorMap.get(SquareColor.DARK);
         if (iconList == null) {
            iconList = new ArrayList<Icon>();
            squareColorMap.put(SquareColor.DARK, iconList);
         }
      }
      iconList.add(new ImageIcon(subImg));
   }

   public Icon getRandomIcon(SquareColor sqrColor) {
      List<Icon> iconList = squareColorMap.get(sqrColor);
      if (iconList == null) {
         return null;
      } else {
         return iconList.get(random.nextInt(iconList.size()));
      }
   }

   public static void main(String[] args) {
      GetChessSquareImages getImages = new GetChessSquareImages();
      try {
         getImages.downloadImages();
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }

      int side = 8;;
      JPanel panel = new JPanel(new GridLayout(side , side));
      for (int i = 0; i < side; i++) {
         for (int j = 0; j < side; j++) {
            SquareColor sqrColor = (i % 2 == j % 2) ? SquareColor.LIGHT : SquareColor.DARK;
            Icon icon = getImages.getRandomIcon(sqrColor);
            panel.add(new JLabel(icon));
         }
      }
      JOptionPane.showMessageDialog(null, panel);
   }
}

enum SquareColor {
   DARK, LIGHT
}

返回此JPanel:

enter image description here

然后您的方块大小将基于您的ImageIcons的大小。例如,我使用比例因子0.8(上面的SCALE常数)缩放我的方块,以使网格更合理。