2013-11-03 149 views
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()方法时停止。

回答

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

编辑,根据你的代码,我以为labe数组ls已经填充了。这是不是这样的,所以你需要删除

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

和翻转这两个指令:

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 
+0

感谢这工作。还有一种方法可以将这两行放在for循环之外以解决性能问题。我知道这不会影响今天的电脑,但这只是一个侧面的问题。 – Trifecta

+0

把它放在循环之外是没有意义的,因为这两行**必须在最内层循环的每次迭代中执行:你需要在每个单元格中有一个标签。 –