2

私は最近ボードゲームを試していて、今はチェッカーボードゲームを作っています. ただし、のセルにチップを表示する方法がわかりませんGridLayout。各セルには、 FOR ループによって 2D 配列に割り当てた独自のJPanelがあります。

特定のJPanelp1Chipにある画像を表示する必要があります。たとえば、変数名 nameを台無しにすることなく、..pngboard[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]);
            }

    }   
    }   
}
4

2 に答える 2

4

JPanelセルにチップを表示するには:

  • チップ画像を ImageIcon に入れる
  • JLabelのsetIcon(chipIcon)メソッドを介してそのImageIconをJLabelに入れます
  • メソッドを介して JLabel を JPanel に追加するadd(someLabel)と、JPanel は画像を表示します。

次に、クリックしてチップを動かしたい場合は、

  • MouseListener と MouseMotionListener (MouseAdaper) を与える
  • クリックすると、JLabel を含む JPanel から JLabel が削除され、最上位ウィンドウのガラス ペインに昇格されます。
  • MouseAdapter で移動します。
  • 離したら、JLabel をマウスが置かれている JPanel に配置します。
于 2013-11-03T15:16:44.957 に答える
1
  1. ボード内の各 のサイズを手動で、JPanel画像と同じ大きさに設定し、必要に応じてパディングを追加します。
  2. を含む 2 次元配列を維持しますJPanel
  3. ユーザーがクリックするたびに呼び出しrepaint()ます。画像を描画する場所JPanelsを上書きすることを忘れないでくださいpaintComponent()JPanel

画像の描画を行う方法は次のとおりです。

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

上記のスニペットではJPanel、ニーズに合わせてカスタムを作成しました。

したがって、ユーザーが最初のJPanel位置 (0 , 0) をクリックするとします。JPanelからを取得し、それboard[][]を呼び出しますrepaint()。これにより、画像が描画されます。

于 2013-11-03T15:13:51.983 に答える