swing - Detecting invalid moves in Tic Tac Toe GUI java + quit button -


i have code entirely working , ran couple of small problems. one, want user receive popup when try select button marked x or o, telling them move invalid , pick another. secondly, i'm trying add quit button bottom of game, makes quit button part of game grid? solution simple , i'm not seeing it, i've tried couple different times , can't seem out of grid. help.

import java.awt.*; import java.awt.event.*; import java.util.random; import javax.swing.*;  class tictactoeframe extends jframe implements actionlistener {  private int[][] winningmoves = new int[][]{     {1, 2, 3}, {4, 5, 6}, {7, 8, 9},     {1, 4, 7}, {2, 5, 8}, {3, 6, 9},     {1, 5, 9}, {3, 5, 7} };  private jframe frame = new jframe("tic tac toe"); private jbutton buttons[] = new jbutton[10]; private jbutton quitbutton = new jbutton("quit"); private int movecount = 0; private string letter = ""; private boolean win = false; actionlistener quitlistener = new quitlistener();  public tictactoeframe() {     jpanel bottom = new jpanel();     bottom.setborder(borderfactory.createlineborder(color.black));     frame.setpreferredsize(new dimension(400, 400));     frame.setdefaultcloseoperation(jframe.exit_on_close);     frame.setlayout(new gridlayout(3, 3));     frame.pack();     frame.setlocationrelativeto(null);     quitbutton.addactionlistener(quitlistener);     bottom.add(quitbutton, borderlayout.south);      (int = 1; <= 9; i++) {         buttons[i] = new jbutton();         frame.add(buttons[i]);         buttons[i].addactionlistener(this);     }      frame.setvisible(true); }  public void actionperformed(actionevent a) {     (int = 1; <= 9; i++) {         if (a.getsource() == buttons[i]) {             buttons[i].settext("x");             buttons[i].setenabled(false);         }     }      movecount++;     computer();  }  public void computer() {     movecount++;     if (buttons[1].gettext().equals("o") && buttons[2].gettext().equals("o") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[4].gettext().equals("o") && buttons[5].gettext().equals("o") && buttons[6].gettext().equals("")) {         buttons[6].settext("o");         buttons[6].setenabled(false);     } else if (buttons[7].gettext().equals("o") && buttons[8].gettext().equals("o") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[2].gettext().equals("o") && buttons[3].gettext().equals("o") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[5].gettext().equals("o") && buttons[6].gettext().equals("o") && buttons[4].gettext().equals("")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[8].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[1].gettext().equals("o") && buttons[3].gettext().equals("o") && buttons[2].gettext().equals("")) {         buttons[2].settext("o");         buttons[2].setenabled(false);     } else if (buttons[4].gettext().equals("o") && buttons[6].gettext().equals("o") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[7].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[8].gettext().equals("")) {         buttons[8].settext("o");         buttons[8].setenabled(false);     } else if (buttons[1].gettext().equals("o") && buttons[4].gettext().equals("o") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[2].gettext().equals("o") && buttons[5].gettext().equals("o") && buttons[8].gettext().equals("")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[3].gettext().equals("o") && buttons[6].gettext().equals("o") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[4].gettext().equals("o") && buttons[7].gettext().equals("o") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[5].gettext().equals("o") && buttons[8].gettext().equals("o") && buttons[2].gettext().equals("")) {         buttons[2].settext("o");         buttons[2].setenabled(false);     } else if (buttons[6].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[1].gettext().equals("o") && buttons[7].gettext().equals("o") && buttons[4].gettext().equals("")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[2].gettext().equals("o") && buttons[8].gettext().equals("o") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[3].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[6].gettext().equals("")) {         buttons[6].settext("o");         buttons[6].setenabled(false);     } else if (buttons[1].gettext().equals("o") && buttons[5].gettext().equals("o") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[5].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[1].gettext().equals("o") && buttons[9].gettext().equals("o") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[3].gettext().equals("o") && buttons[5].gettext().equals("o") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[7].gettext().equals("o") && buttons[5].gettext().equals("o") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[7].gettext().equals("o") && buttons[3].gettext().equals("o") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[2].gettext().equals("x") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[4].gettext().equals("x") && buttons[5].gettext().equals("x") && buttons[6].gettext().equals("")) {         buttons[6].settext("o");         buttons[6].setenabled(false);     } else if (buttons[7].gettext().equals("x") && buttons[8].gettext().equals("x") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[2].gettext().equals("x") && buttons[3].gettext().equals("x") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[5].gettext().equals("x") && buttons[6].gettext().equals("x") && buttons[4].gettext().equals("")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[8].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[3].gettext().equals("x") && buttons[2].gettext().equals("")) {         buttons[2].settext("o");         buttons[2].setenabled(false);     } else if (buttons[4].gettext().equals("x") && buttons[6].gettext().equals("x") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[7].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[8].gettext().equals("")) {         buttons[8].settext("o");         buttons[8].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[4].gettext().equals("x") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[2].gettext().equals("x") && buttons[5].gettext().equals("x") && buttons[8].gettext().equals("")) {         buttons[8].settext("o");         buttons[8].setenabled(false);     } else if (buttons[3].gettext().equals("x") && buttons[6].gettext().equals("x") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[4].gettext().equals("x") && buttons[7].gettext().equals("x") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[5].gettext().equals("x") && buttons[8].gettext().equals("x") && buttons[2].gettext().equals("")) {         buttons[2].settext("o");         buttons[2].setenabled(false);     } else if (buttons[6].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[7].gettext().equals("x") && buttons[4].gettext().equals("")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[2].gettext().equals("x") && buttons[8].gettext().equals("x") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[3].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[6].gettext().equals("")) {         buttons[6].settext("o");         buttons[6].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[5].gettext().equals("x") && buttons[9].gettext().equals("")) {         buttons[9].settext("o");         buttons[9].setenabled(false);     } else if (buttons[5].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[9].gettext().equals("x") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[3].gettext().equals("x") && buttons[5].gettext().equals("x") && buttons[7].gettext().equals("")) {         buttons[7].settext("o");         buttons[7].setenabled(false);     } else if (buttons[7].gettext().equals("x") && buttons[5].gettext().equals("x") && buttons[3].gettext().equals("")) {         buttons[3].settext("o");         buttons[3].setenabled(false);     } else if (buttons[7].gettext().equals("x") && buttons[3].gettext().equals("x") && buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[1].gettext().equals("x") && buttons[5].gettext().equals("o") && buttons[9].gettext().equals("x")) {         buttons[6].settext("o");         buttons[6].setenabled(false);     } else if (buttons[3].gettext().equals("x") && buttons[5].gettext().equals("o") && buttons[7].gettext().equals("x")) {         buttons[4].settext("o");         buttons[4].setenabled(false);     } else if (buttons[5].gettext().equals("")) {         buttons[5].settext("o");         buttons[5].setenabled(false);     } else if (buttons[1].gettext().equals("")) {         buttons[1].settext("o");         buttons[1].setenabled(false);     } else {         if (movecount >= 9) {             checkwinner();         } else {             random();         }     }      checkwinner();  }  public void random() {     random x = new random();     int y = 1 + x.nextint(9);     if (buttons[y].gettext().equals("o") || buttons[y].gettext().equals("x")) {         random();     } else {         buttons[y].settext("o");         buttons[y].setenabled(false);     } }  class quitlistener implements actionlistener {     public void actionperformed(actionevent evt)     {         system.exit(0);     }  }  public void checkwinner() {     (int = 0; <= 7; i++) {         if (buttons[winningmoves[i][0]].gettext().equals(buttons[winningmoves[i][1]].gettext())                 && buttons[winningmoves[i][1]].gettext().equals(buttons[winningmoves[i][2]].gettext())                 && !buttons[winningmoves[i][0]].gettext().equals("")) {             win = true;         }     }      if (movecount % 2 == 0) {         letter = "o";     } else {         letter = "x";     }      if (win == true) {         int select = joptionpane.showconfirmdialog(null, letter + " wins! play again?");         if(select == joptionpane.yes_option)          {             (int = 1; <= 9; i++)              {             buttons[i].settext("");             buttons[i].setenabled(true);             movecount = 0;             win = false;             }         }         else          {             if(select == joptionpane.no_option)              {                 system.exit(0);             }             }     }     else if (movecount >= 9 && win == false)      {         int select = joptionpane.showconfirmdialog(null, "it's tie! play again?");         if(select == joptionpane.yes_option)          {             (int = 1; <= 9; i++)              {             buttons[i].settext("");             buttons[i].setenabled(true);             movecount = 0;             win = false;             }         }         else          {             if(select == joptionpane.no_option)              {                 system.exit(0);             }             }     } } } 

runner:

import javax.swing.jframe;  public class tictactoerunner  {     public static void main(string[] args)      {     jframe frame = new tictactoeframe();     frame.setvisible(true); } } 

  1. in jbutton's actionlistener, can button has been pressed via actionevent's getsource() method. call gettext() on jbutton , if holds offending text, show error joptionpane. or use buttons[i] variable within loop, since points offending jbutton.
  2. if go route, be sure exit button has own separate actionlistener. otherwise may run trouble. inner anonymous class work here.
  3. you've set layout of entire gui, jframe, gridlayout, , boxes grid whether or not. don't this. leave jframe's contentpane use default borderlayout, create new jpanel tic tac toe grid, give gridlayout, add jframe borderlayout.center, , add bottom jpanel jframe borderlayout.page_end.

side recommendations unrelated questions:

  • get rid of redundancy. unnecessarily complex code hard debug code.
  • separate program logic (the logic underlying tic-tac-toe game) gui code. make easier debug , enhance game.
  • in future, strive ask single specific question yours appears multi-parter.

Comments