Java Swing面板以不同方式布局图像

时间:2015-08-06 17:04:10

标签: java swing

过去一周我一直在研究Java,并考虑实现一个简单的记忆游戏,其中计算机首先显示一组图像重复图像,然后在一段时间后关闭所有图像。然后,用户必须选择显示相同图像的图块。要从我的图像/文件夹和显示器加载图像,我写了以下代码。

Board.java

import java.awt.GridLayout;
import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.stream.*;
import java.nio.file.*;
import java.nio.*;
import java.io.*;
import java.util.*;

class Board extends JPanel{
    //make tile part of the board
    private class Tile extends JLabel{
    private String icon_path;
    public Tile(ImageIcon icon, String icon_path){
        super(icon);
        this.icon_path = icon_path;

    }
    public String getIconPath(){
        return icon_path;
    }
}


private int num_rows=4;
private int num_columns = 2;
private boolean playable = true; //playable tells us whether the board is playable, true means game not over
private List<Tile> tiles = new LinkedList<Tile>();

public boolean isPlayable(){
    return playable;
}


public Board(int rows, int columns){
    this();
    this.num_rows = rows;
    this.num_columns = columns;


}

public Board(){
    setLayout(new GridLayout(num_rows, num_columns));
    fillBoard();
}

private void fillBoard(){
    List<Path> image_paths = null;
    try(Stream<Path> paths = Files.list(Paths.get("images"))){
        image_paths = paths.collect(Collectors.toList());
    }
    catch(IOException e){
        e.printStackTrace();
    }
    // Tile temp_tile = null;

    for(Path p: image_paths){

        try {
         BufferedImage img = ImageIO.read(new File(p.toString()));
         Tile temp_tile1 = new Tile(new ImageIcon(img), p.toString());
         Tile temp_tile2 = new Tile(new ImageIcon(img), p.toString());

         tiles.add(temp_tile1);
         // add(temp_tile);
         tiles.add(temp_tile2);
         // add(temp_tile);

         // tiles.add(new Tile(new ImageIcon(img), p.toString()));
         // tiles.add(new Tile(new ImageIcon(img), p.toString()));

         // tiles.add(temp_tile);
         // add(temp_tile);
         // add(new Tile(new ImageIcon(img), p.toString()));
         // add(new Tile(new ImageIcon(img), p.toString()));

              // add(temp_tile);
          }
          catch (IOException e) {
             e.printStackTrace();
          }
        }//end of for loop

        for(Tile t: tiles){
            add(t);
        }
    }// end of fill board

}

MemoryGame.java

    import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.BorderLayout;

public class MemoryGame{
    private JFrame mainPanel  = new JFrame("Memory Game");
    private Board board = new Board(4,2);
    public MemoryGame(){
        mainPanel.setLayout(new BorderLayout());
        mainPanel.add(board, BorderLayout.CENTER);

        mainPanel.setSize(800,800);
        mainPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel.pack();
        mainPanel.setVisible(true);
    }
    public static void main(String[] args) {
        new MemoryGame();
    }

}

这是在做这项工作。即以4x2网格加载图像。 现在,Board.java的foreach循环中的实际代码是这样的:

        for(Path p: image_paths){

        try {
         BufferedImage img = ImageIO.read(new File(p.toString()));
         Tile temp_tile = new Tile(new ImageIcon(img), p.toString());


         tiles.add(temp_tile);
         add(temp_tile);
         tiles.add(temp_tile);
         add(temp_tile);
                   catch (IOException e) {
         e.printStackTrace();
      }
    }//end of for loop
}// end of fill board

}

使用此版本虽然我已经调用了两次面板添加方法(创建两个具有相同图标的图块),但未加载复制图像并且我得到4x1网格。 java是否将项目插入处理为JPanel,就像它是一个集合一样? 有人能解释一下这里发生了什么吗? 还有更好的方法来进行此操作吗?

0 个答案:

没有答案