Java 如何在特定的JPanel中放置图像?

Java 如何在特定的JPanel中放置图像?,java,swing,jpanel,grid-layout,Java,Swing,Jpanel,Grid Layout,我最近在尝试棋盘游戏,现在我正在做一个跳棋棋盘游戏。然而,我不知道如何在GridLayout的单元格中显示芯片。每个单元格都有自己的JPanel,我通过FOR循环在2D数组中指定了它 我需要在特定的JPanel中显示图像p1Chip,它只是一个.png,假设它的变量名是board[2][3],而不会弄乱网格布局 关于如何做到这一点的示例代码将非常有用,因为它将帮助我更好地理解 我在网上搜索过,但找不到我需要的东西,或者至少找不到解释如何做的东西 以下是迄今为止的代码: package check

我最近在尝试棋盘游戏,现在我正在做一个跳棋棋盘游戏。然而,我不知道如何在
GridLayout
的单元格中显示芯片。每个单元格都有自己的JPanel,我通过FOR循环在2D数组中指定了它

我需要在特定的JPanel中显示图像
p1Chip
,它只是一个
.png
,假设它的变量名是
board[2][3]
,而不会弄乱
网格布局

关于如何做到这一点的示例代码将非常有用,因为它将帮助我更好地理解

我在网上搜索过,但找不到我需要的东西,或者至少找不到解释如何做的东西

以下是迄今为止的代码:

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();
    }

}
包检查器;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GridLayout;
导入java.awt.Image;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.border.EmptyBorder;
导入java.awt.Color;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.image.buffereImage;
导入java.awt.image.ImageObserver;
导入java.io.File;
导入java.io.IOException;
导入javax.swing.JTextField;
公共类主框架{
私有JPanel内容窗格;
图像处理芯片;
JPanel[]董事会=新JPanel[8][8];
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
主机架=新主机架();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
public Main()引发IOException{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100800800);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
startGame();
}
//开始游戏!
public void startName()引发IOException{
绞车();
}
//******************************画板******************************\\
//画板
public void drawBoard()引发IOException{
System.out.println(“启动绘图板!”);
getContentPane().setLayout(新的GridLayout(8,8));
int colorsassignrow=0;
int colorsassigncol=0;
对于(int r=0;r<8;r++){
colorAssignRow++;
colorAssignCol=0;
对于(int c=0;c<8;c++){
ColorCol++;
board[r][c]=新JPanel();
如果(第%2行!=0){
如果(colorAssignCol%2==0)板[r][c].setBackground(颜色.红色);
else板[r][c]。立根背景(颜色:黑色);
}
else if(colorAssignRow%2==0){
如果(colorAssignCol%2==0)板[r][c].setBackground(颜色.黑色);
else板[r][c]。立根背景(颜色:红色);
}
getContentPane().add(board[r][c]);
}
}
System.out.println(“完成电路板绘图!”);
}
//******************************画板末端******************************\\
公共资产(){
System.out.println(“获取资产!”);
p1Chip=newImageIcon(“P1ChipNormal.png”).getImage();
}
}
上面的代码工作正常,因为它只输出JPanels的棋盘,每个棋盘位于网格的不同单元格中

更新: 添加此方法是为了显示芯片,但是当我运行此方法时,没有显示芯片

 public void drawChips(){


    /*
     * When:    0 and even
     *          1 and odd
     *          2 and even
     */

    //Drawing Player One Chips\\
    for(int r = 0; r < 8; r++){ 
        for(int c = 0; c < 8; c++){

            label[r][c] = new JLabel();
            board[r][c] = new JPanel();

            if(r==0 && c%2==0){
                label[r][c].setIcon(p1Chip);
                board[r][c].add(label[r][c]);
            }
            else if(r==1 && c%2!=0 && c!=0){
                label[r][c].setIcon(p1Chip);
                board[r][c].add(label[r][c]);
            }
            else if(r==2 && c%2==0){
                label[r][c].setIcon(p1Chip);
                board[r][c].add(label[r][c]);
            }

    }   
    }   
}
public-void-drawChips(){
/*
*时间:0和偶数
*1和奇数
*2甚至
*/
//抽一个筹码\\
对于(int r=0;r<8;r++){
对于(int c=0;c<8;c++){
label[r][c]=新的JLabel();
board[r][c]=新JPanel();
如果(r==0&&c%2==0){
标签[r][c].setIcon(p1芯片);
板[r][c]。添加(标签[r][c]);
}
如果(r==1&&c%2!=0&&c!=0),则为else{
标签[r][c].setIcon(p1芯片);
板[r][c]。添加(标签[r][c]);
}
否则如果(r==2&&c%2==0){
标签[r][c].setIcon(p1芯片);
板[r][c]。添加(标签[r][c]);
}
}   
}   
}
  • 手动将电路板中每个
    JPanel
    的大小设置为与图像一样大,如果您选择,还可以添加一些填充
  • 维护一个包含
    JPanel
    s的二维数组
  • 每当用户单击
    JPanels
    时,调用
    repaint()
    。不要忘了在
    JPanel上绘制图像的
    paintComponent()
    上覆盖
  • 以下是您如何绘制图像:

    JPanel onePanel = new JPanel(){
                                    @Override
                                    public void paintComponent(Graphics g){
                                        super.paintComponent(g);
                                        g.drawImage(image,0,0,null);
                                    }
                                }    
    
    在上面的代码片段中,我创建了一个定制的
    JPanel
    ,以满足需要


    因此,假设用户单击位于位置(0,0)的第一个
    JPanel
    。您可以从
    board[][]
    中检索
    JPanel
    ,并在其上调用
    repaint()
    。这将导致绘制图像

    要在JPanel单元中显示芯片:

    • 将芯片图像放入图像图标中
    • 通过JLabel的
      设置图标(芯片图标)
      方法将该图像图标放入JLabel
    • 通过
      Add(someLabel)
      方法将JLabel添加到JPanel中,JPanel现在将显示图像
    如果你想点击并移动芯片