java - How to remove NullPointerExceptions due to JButton array -
i'm terribly unfamiliar swing, here i'm trying make "clacker" game each time 2 dice rolled, either click 2 (or 1 if they're same number) buttons representing 2 numbers or 1 button representing sum of 2 numbers. if button clicked, visible set false. have jbutton array hold 12 buttons, every time reference made array buttons, throws nullpointerexception. i've tried putting code making jbutton array within constructor , actionperformed, still throws same exception.
here code:
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]; (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); (int i=0; i<7; i++) ////here { if (i==newroll) buttons[i].setenabled(true); if (i==newroll2) buttons[i].setenabled(true); } (int i=7; i<13; i++) { if (sum==i) buttons[i].setenabled(true); } string eventname = event.getactioncommand(); (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); (int i=0; i<7; i++) buttons[i].setenabled(false); } } } (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; (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();}});} }
in setarray
you're declaring local variable instead of referencing class member variable. change
jbutton[] buttons = new jbutton[12];
to
this.buttons = new jbutton[12];
Comments
Post a Comment