2012-06-10 17 views
1

我對swing很不熟悉,但在這裏我試圖做一個「clacker」遊戲,每次擲出兩個骰子時,無論是點擊兩個(或1個,如果他們代表這兩個數字的按鈕或代表這兩個數字總和的一個按鈕。如果點擊一個按鈕,可見被設置爲false。我有一個JButton數組來容納12個按鈕,但每次引用數組按鈕時,都會引發NullPointerException。我試着把代碼製作成構造函數和actionPerformed中的JButton數組,但它仍然會拋出相同的異常。如何刪除由於JButton數組引起的NullPointerExceptions

下面是代碼:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 

public class Clacker implements ActionListener 
{ 
    JPanel panel; 
    JFrame frame; 
    JLabel dieFace1, dieFace2, numTurns; 
    JButton[] buttons; 
    JButton rollDie, reset; 
    String turn="Turns: "; 
    int turns, numCovered; 

public Clacker() 
{ 
    frame = new JFrame("clacker"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    panel=new JPanel(); 
    panel.setBorder(BorderFactory.createEmptyBorder(50,30,50,30)); 
    panel.setBackground(Color.gray); 
    panel.setLayout(new GridLayout(5,10,1,1)); 

    dieFace1=new JLabel(new ImageIcon("die3.jpg")); 
    dieFace1.setAlignmentX(JLabel.RIGHT_ALIGNMENT); 
    dieFace1.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); 
    panel.add(dieFace1); 

    dieFace2=new JLabel(new ImageIcon("die3.jpg")); 
    dieFace2.setAlignmentX(JLabel.RIGHT_ALIGNMENT); 
    dieFace2.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); 
    panel.add(dieFace2); 

    rollDie=new JButton("Roll Die"); 
    rollDie.setAlignmentX(JButton.RIGHT_ALIGNMENT); 
    rollDie.addActionListener(this); 
    panel.add(rollDie); 

    numTurns=new JLabel(turn+turns); 
    numTurns.setAlignmentX(JLabel.LEFT_ALIGNMENT); 
    numTurns.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); 
    panel.add(numTurns); 

    setArray(); 

    reset=new JButton("Reset"); 
    reset.setAlignmentX(JButton.LEFT_ALIGNMENT); 
    reset.addActionListener(this); 
    panel.add(reset); 

    frame.setContentPane(panel); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public void setArray() 
{ 
    JButton[] buttons = new JButton[12]; 
    for (int i=0; i<12; i++) 
    { 

     buttons[i]= new JButton(i+1+""); 
     buttons[i].setActionCommand(i+""); 
     buttons[i].addActionListener(this); 
     panel.add(buttons[i]); 
     buttons[i].setEnabled(false); 
     System.out.println(buttons[i]); 
    } 
} 

public void actionPerformed(ActionEvent event) 
{ 
    if (event.getActionCommand().equals("Roll Die")) 
    { 
     Random asdf = new Random(); 
     int newRoll= asdf.nextInt(6)+1; 
     dieFace1.setIcon(new ImageIcon("die"+newRoll+".jpg")); 

     Random asdf2 = new Random(); 
     int newRoll2= asdf2.nextInt(6)+1; 
     dieFace2.setIcon(new ImageIcon("die"+newRoll2+".jpg")); 

     int sum=newRoll+newRoll2; 
     turns++; 
     numTurns.setText(turn+turns); 

     for (int i=0; i<7; i++)         ////here       
     { 
      if (i==newRoll) 
       buttons[i].setEnabled(true); 
      if (i==newRoll2) 
       buttons[i].setEnabled(true); 
     } 

     for (int i=7; i<13; i++) 
     { 
      if (sum==i) 
       buttons[i].setEnabled(true); 
     } 

     String eventName = event.getActionCommand(); 
     for (int b=1; b<13; b++) 
     { 
     if (eventName.equals(buttons[b].getActionCommand()))  ////here    
      { 
       if (Integer.parseInt(eventName)>6) 
       { 
        buttons[b].setText(""); 
        numCovered++; 
        buttons[b].setVisible(false); 
        for (int i=0; i<7; i++) 
         buttons[i].setEnabled(false); 
       } 
      } 
     } 

     for (int i=0; i<buttons.length; i++)      ////here        
      buttons[i].setEnabled(false); 

     if (numCovered==12) 
     { 
      rollDie.setEnabled(false); 
      numTurns.setText("Win! "+turns+" turns"); 
     } 

    } 

    else if (event.getActionCommand().equals("Reset")) 
    { 
     turns=0; 
     numTurns.setText(turn+turns); 
     rollDie.setEnabled(true); 
     numCovered=0; 
     for (int i=0; i<buttons.length; i++)      ////here        
     { 
      buttons[i].setVisible(true); 
      buttons[i].setEnabled(false); 
     } 
    } 
} 

private static void runGUI() 
{ JFrame.setDefaultLookAndFeelDecorated(true); Clacker game = new Clacker();} 

public static void main(String[] args) 
{ javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() { runGUI();}});} 
} 

回答

4

setArray你聲明一個局部變量,而不是引用類的成員變量。只要改變

JButton[] buttons = new JButton[12]; 

this.buttons = new JButton[12]; 
+0

哎呦!那就是訣竅。謝謝! – user1115006