简体   繁体   English

如何制作 JPanel 网格?

[英]How do I make A JPanel grid?

i'm trying to create a gui for chess-like game (6x6 board with less pieces).我正在尝试为类似国际象棋的游戏创建一个 gui(6x6 棋盘,棋子较少)。

creating the board is pretty easy with for loops and JPanels but I have no idea how to put the pieces on top of the JPanel.使用 for 循环和 JPanel 可以很容易地创建电路板,但我不知道如何将这些部件放在 JPanel 之上。 I tried adding one piece by creating a JLabel object with an icon and add it to JPanel but it doesn't look good.我尝试通过创建一个带有图标的 JLabel 对象来添加一件并将其添加到 JPanel 中,但它看起来不太好。

public class BoardPanel extends JPanel
{
    public static final int LENGTH = 6;
    private final Color[] COLOR_ARRAY = {Color.decode("#FFFACD"), Color.decode("#593E1A")};

    public BoardPanel() 
    {
        //grid layout 6x6
        setLayout(new GridLayout(LENGTH, LENGTH));
        int numView = 0;
        //tiles color determined by odd/even
        for (int i = 0; i < LENGTH; i++) 
            {
                for (int j = 0; j < LENGTH; j++)
                {
                    add(new TileView(numView, COLOR_ARRAY[j % 2]));
                }

                swap();
            }

    }

    private void swap() {

        Color temp = COLOR_ARRAY[0];
        COLOR_ARRAY[0] = COLOR_ARRAY[1];
        COLOR_ARRAY[1] = temp;
    }
}

is there a particular class that i need to use in order to do this properly?是否有我需要使用的特定类才能正确执行此操作? default board:默认板:

默认板

board with one piece:一块板:

一块板

Thanks,谢谢,

To get the board right, just handle the color change :要获得正确的电路板,只需处理颜色变化:

class BoardPanel extends JPanel
{
    public static final int LENGTH = 6;
    private final Color[] COLOR_ARRAY = {Color.decode("#FFFACD"), Color.decode("#593E1A")};

    public BoardPanel()   {
        //grid layout 6x6
        setLayout(new GridLayout(LENGTH, LENGTH));
        int numView = 1;

        for (int i = 0; i < LENGTH; i++)
        {
            numView = (numView == 0) ? 1:0;
            for (int j = 0; j < LENGTH; j++)
            {
                add(new TileView(COLOR_ARRAY[numView]));
                numView = (numView == 0) ? 1:0;
            }
        }
    }
}

class TileView extends JLabel {

    TileView(Color color) {
        setPreferredSize(new Dimension(100,100));
        setOpaque(true);
        setBackground(color);
    }
}

Trying to add another component (the piece) to the board (gridlayout) messes it up.尝试将另一个组件(部件)添加到电路板(网格布局)会将其搞砸。
What you want to do is add another JPanel that contains the pieces.您想要做的是添加另一个包含这些片段的JPanel
The pieces JPanel needs to be transparent, so the board under it, is visible. JPanel需要透明,所以它下面的板是可见的。 One way to achieve it in swing is to use a glass pane :在摆动中实现它的一种方法是使用玻璃板:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Chess extends JFrame {

    public Chess()  {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add( new BoardPanel());          //add underlaying board
        setGlassPane(new PiecesPanel()); //add glass pane
        getGlassPane().setVisible(true);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) throws InterruptedException {
        new Chess();
    }
}

class BoardPanel extends JPanel {

    public static final int LENGTH = 6;
    private final Color[] COLOR_ARRAY = {Color.decode("#FFFACD"), Color.decode("#593E1A")};

    public BoardPanel()   {
        //grid layout 6x6
        setLayout(new GridLayout(LENGTH, LENGTH));
        int numView = 1;
        //tiles color determined by odd/even
        for (int i = 0; i < LENGTH; i++)
        {
            numView = (numView == 0) ? 1:0;
            for (int j = 0; j < LENGTH; j++)
            {
                add(new TileView(COLOR_ARRAY[numView]));
                numView = (numView == 0) ? 1:0;
            }
        }
    }
}

//container for pieces
class PiecesPanel extends JPanel {

    public static final int LENGTH = 6;
    PiecesPanel(){

        setOpaque(false); //make it transparent
        setLayout(new GridLayout(LENGTH, LENGTH));
        JComponent piece = new Piece();
        add(piece);
    }
}

class TileView extends JLabel {

    public static final int SIZE = 100;
    TileView(Color color) {
        setPreferredSize(new Dimension(SIZE, SIZE));
        setOpaque(true);
        setBackground(color);
    }
}

class Piece extends JLabel{

    Piece() {

        URL url = null;
        try {
            url = new URL("https://dl1.cbsistatic.com/i/r/2017/08/15/9b37ca73-de21-4998-ae7a-07d2915a551e/thumbnail/64x64/0cd91f1c045919af6bdafab3a6f07f99/imgingest-6339051052035379444.png");
        } catch (MalformedURLException ex) { ex.printStackTrace();  }
        setIcon(new ImageIcon(url));
        setVerticalTextPosition(SwingConstants.BOTTOM);
        setHorizontalTextPosition(SwingConstants.CENTER);
    }
}

Edit: the Piece image link is dead.编辑: Piece 图片链接已失效。 Use https://findicons.com/files/icons/2711/free_icons_for_windows8_metro/64/pawn.png instead改用https://findicons.com/files/icons/2711/free_icons_for_windows8_metro/64/pawn.png



在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM