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

时间:2013-11-03 15:01:56

标签: java swing jpanel grid-layout

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

我需要在特定的 JPanel 中显示只有p1Chip的图片.png,让我们说它的变量名称是{ {1}},而不会弄乱board[2][3]

关于如何做到这一点的示例代码会很棒,因为它可以帮助我更好地理解。

我搜索了互联网,但找不到我需要的内容,或者至少找不到解释如何操作的东西。

以下是目前的代码:

GridLayout

上面的代码运行正常,因为它只输出 JPanels 的Checkers板,每个板位于网格的不同单元格中。

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

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

}

2 个答案:

答案 0 :(得分:4)

在JPanel单元中显示芯片:

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

然后,如果你想点击并移动芯片,

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

答案 1 :(得分:1)

  1. 如果您愿意,手动将电路板中每个JPanel的大小设置为图像加上一些填充。
  2. 维护包含JPanel s的二维数组。
  3. 每当用户点击时,就repaint()致电JPanels。不要忘记覆盖在paintComponent()
  4. 上绘制图像的JPanel

    以下是如何进行图像绘制的方法:

    JPanel onePanel = new JPanel(){
                                    @Override
                                    public void paintComponent(Graphics g){
                                        super.paintComponent(g);
                                        g.drawImage(image,0,0,null);
                                    }
                                }    
    

    在上面的代码段中,我创建了一个自定义JPanel以满足需求。

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