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现在将显示图像
如果你想点击并移动芯片