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

我最近正在尝试棋盘游戏,现在我正在制作Checkers棋盘游戏。 但是,我可以弄清楚如何在GridLayout的单元格中显示芯片。 每个单元都有自己的JPanel ,我通过FOR循环在2D数组中分配。

我需要在特定的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(); } } 

上面的代码工作正常,因为它只输出JPanel的Checkers板,每个板都在网格的不同单元格中。

更新:添加此方法以显示芯片,但是当我运行此方法时,没有芯片出现。

  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的Jaabel中删除JLabel,并将其提升到顶层窗口的玻璃窗格。
  • 使用MouseAdapter移动它。
  • 释放后,将JLabel放在鼠标hover的JPanel上。
  1. 手动将电路板中每个JPanel的大小设置为与图像一样大,如果选择则加上一些填充。
  2. 维护包含JPanel的2d数组。
  3. 只要用户点击它,就可以在JPanels上调用repaint() 。 不要忘记覆盖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 。 您从board[][]检索JPanel并在其上调用repaint() 。 这将导致图像被绘制。