如何将图像放在特定的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上。
- 手动将电路板中每个
JPanel
的大小设置为与图像一样大,如果选择则加上一些填充。 - 维护包含
JPanel
的2d数组。 - 只要用户点击它,就可以在
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()
。 这将导致图像被绘制。