0
我正在尝试制作跳棋游戏。我知道在的JLabel插入的ImageIcon,并把它在一个的JPanel的基础知识。将JLabel添加到JPanel
我在这里是每个单元格中带有JPanel的网格。通过将代码放入drawsBoard()
方法(不在下面的代码中)中,我设法将JLabel的数组分配给JPanel。
但是我需要在一个单独的方法中做到这一点,使事情看起来更好。当我试图运行下面的代码时,不像以前那样在芯片上显示芯片。我错过了什么?你可以编译它并亲自查看。
这里是我的代码:
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******************************\\
}
UPDATE:
这是我得到的错误,当我删除
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()方法时停止。
感谢这工作。还有一种方法可以将这两行放在for循环之外以解决性能问题。我知道这不会影响今天的电脑,但这只是一个侧面的问题。 – Trifecta
把它放在循环之外是没有意义的,因为这两行**必须在最内层循环的每次迭代中执行:你需要在每个单元格中有一个标签。 –