我正在尝试最近的棋盘游戏,现在我正在制作 Checkers 棋盘游戏。但是,我可以弄清楚如何在GridLayout
的单元格中显示芯片。每个单元格都有自己的 JPanel ,我通过 FOR循环 在2D数组中分配。
我需要在特定的 JPanel 中显示只有p1Chip
的图片.png
,让我们说它的变量名称是{ {1}},而不会弄乱board[2][3]
。
关于如何做到这一点的示例代码会很棒,因为它可以帮助我更好地理解。
我搜索了互联网,但找不到我需要的内容,或者至少找不到解释如何操作的东西。
以下是目前的代码:
GridLayout
上面的代码运行正常,因为它只输出 JPanels 的Checkers板,每个板位于网格的不同单元格中。
更新: 添加此方法以显示芯片,但是当我运行此方法时,没有芯片出现。
package checkers;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.swing.JTextField;
public class Main extends JFrame {
private JPanel contentPane;
Image p1Chip;
JPanel[][] board = new JPanel[8][8];
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() throws IOException {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 800, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
startGame();
}
//Start Game!
public void startGame() throws IOException{
drawBoard();
}
//******************************DRAWS BOARD******************************\\
//Draws the board
public void drawBoard() throws IOException{
System.out.println("Start Drawing Board!");
getContentPane().setLayout(new GridLayout(8,8));
int colorAssignRow = 0;
int colorAssignCol = 0;
for(int r = 0; r < 8; r++){
colorAssignRow++;
colorAssignCol = 0;
for(int c = 0; c < 8; c++){
colorAssignCol++;
board[r][c] = new JPanel();
if(colorAssignRow%2!=0){
if(colorAssignCol%2==0)board[r][c].setBackground(Color.RED);
else board[r][c].setBackground(Color.BLACK);
}
else if(colorAssignRow%2==0){
if(colorAssignCol%2==0)board[r][c].setBackground(Color.BLACK);
else board[r][c].setBackground(Color.RED);
}
getContentPane().add(board[r][c]);
}
}
System.out.println("Board Drawing Done!");
}
//******************************END OF DRAWING BOARD******************************\\
public void getAssets(){
System.out.println("Getting assets!");
p1Chip = new ImageIcon("P1ChipNormal.png").getImage();
}
}
答案 0 :(得分:4)
在JPanel单元中显示芯片:
setIcon(chipIcon)
方法将ImageIcon放入JLabel add(someLabel)
方法将JLabel添加到JPanel - 现在JPanel将显示图像。然后,如果你想点击并移动芯片,
答案 1 :(得分:1)
JPanel
的大小设置为图像加上一些填充。 JPanel
s的二维数组。 repaint()
致电JPanels
。不要忘记覆盖在paintComponent()
JPanel
醇>
以下是如何进行图像绘制的方法:
JPanel onePanel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image,0,0,null);
}
}
在上面的代码段中,我创建了一个自定义JPanel
以满足需求。
因此,假设用户点击了位置(0,0)上的第一个JPanel
。您从JPanel
检索board[][]
并在其上调用repaint()
。这将导致图像被绘制。