0

チェッカーゲームを作ろうとしています。JLabelにImageIconを挿入し、JPanelに配置する基本を知っています。

ここにあるのは、各セルに JPanel があるグリッドです。drawsBoard()コードをメソッド(NOT IN THE CODE BELOW)に配置することで、JLabels の配列を JPanels に割り当てることができました。

ただし、見栄えを良くするには、別の方法でこれを行う必要があります。以下のコードを実行しようとすると、以前とは異なり、ボードにチップが表示されません。私は何が欠けていますか?あなたはそれをコンパイルして自分で見ることができます。

これが私のコードです:

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;

    ImageIcon p1Chip;

    JPanel[][] board = new JPanel[8][8];
    JLabel[][] label = new JLabel[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{

            getAssets();
            drawBoard();
            drawChips();            
        }

    //ASSETS
        public void getAssets(){
            System.out.println("Getting assets!");
            p1Chip = new ImageIcon("C:/Users/Trifecta/Desktop/Java Exercises/Checkers/src/checkers/P1ChipNormal.png");
        }   


//******************************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******************************\\

//THIS IS THE PART THAT IS NOT WORKING  
//******************************DRAWING CHIPS******************************\\

    public void drawChips(){


    /*
     * Put Chip When:   (r and c)
     *                  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].setIcon(p1Chip);
                label[r][c] = new JLabel();
                board[r][c] = new JPanel();


                if(r==0 && c%2==0){
                    board[r][c].add(label[r][c]);

                }
                else if(r==1 && c%2!=0 && c!=0){    
                    board[r][c].add(label[r][c]);

                }
                else if(r==2 && c%2==0){
                    board[r][c].add(label[r][c]);

                }
                 revalidate();
                 repaint();

            }

        }
    //End Of Drawing Player One Chips\\

    }

//******************************END OF DRAWING CHIPS******************************\\

}

アップデート:

これは、削除したときに表示されるエラーです

label[r][c] = new JLabel();

board[r][c] = new JPanel();

java.lang.NullPointerException
    at checkers.Main.drawChips(Main.java:145)
    at checkers.Main.startGame(Main.java:69)
    at checkers.Main.<init>(Main.java:60)
    at checkers.Main$1.run(Main.java:43)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

drawChips() メソッドが呼び出されると停止します。

4

1 に答える 1

3

コードはボードを描画し、すべてのパネルを初期化してから、次のことを行います。

label[r][c].setIcon(p1Chip); // set the icon of the label
label[r][c] = new JLabel(); // replace the label in the array, containing the icon, by a new one, without any icon
board[r][c] = new JPanel(); // replace the already initialized panel in the board by a new, empty one

...

board[r][c].add(label[r][c]); // add the empty label to the empty panel.

したがって、意味をなさない次の行を削除します。

label[r][c] = new JLabel();
board[r][c] = new JPanel();

また、役に立たない次の行も削除します。

revalidate();
repaint();

EDIT、あなたのコードに基づいて、ラベルの配列はすでに設定されていると思いました。これは当てはまらないので、削除する必要があります

board[r][c] = new JPanel();

これらの 2 つの命令を反転するには:

label[r][c].setIcon(p1Chip); // set the icon of the label
label[r][c] = new JLabel(); // create the label

アイコンを設定する前に、ラベルを作成する必要があります。だからそうあるべきだ

label[r][c] = new JLabel(); // create the label
label[r][c].setIcon(p1Chip); // set the icon of the label
于 2013-11-03T16:51:59.630 に答える