过去一周我一直在研究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,就像它是一个集合一样? 有人能解释一下这里发生了什么吗? 还有更好的方法来进行此操作吗?