gpt4 book ai didi

java - 如何将图像放在特定的 JPanel 中?

转载 作者:行者123 更新时间:2023-11-30 06:22:02 25 4
gpt4 key购买 nike

我最近正在尝试棋盘游戏,现在我正在制作一个跳棋棋盘游戏。但是我无法弄清楚如何在 GridLayout 的单元格中显示芯片。每个单元格都有自己的 JPanel,我通过 FOR 循环 在二维数组中分配了它。

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

有关我如何执行此操作的示例代码会很棒,因为它将帮助我更好地理解。

我已经在互联网上进行了搜索,但找不到我需要的东西,或者至少找不到说明如何操作的东西。

这是目前的代码:

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

}

上面的代码工作正常,因为它只输出 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]);
}

}
}
}

最佳答案

在 JPanel 单元格中显示芯片:

  • 将芯片图片放入ImageIcon
  • 通过 JLabel 的 setIcon(chipIcon) 方法将该 ImageIcon 放入 JLabel
  • 通过 add(someLabel) 方法将 JLabel 添加到 JPanel —— 现在 JPanel 将显示图像。

那么如果你想点击移动筹码,

  • 给它 MouseListener 和 MouseMotionListener (MouseAdapater)
  • 单击时,从包含它的 JPanel 中删除 JLabel,并将其提升到顶层窗口的玻璃 Pane 。
  • 使用 MouseAdapter 移动它。
  • 释放后,将 JLabel 放置在鼠标悬停的 JPanel 上。

关于java - 如何将图像放在特定的 JPanel 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com