JPanel refresh issue with game -
i making lan command based game, , parsing structured english java. have parsed , can draw grid, can hard code text grid before runtime , cant seem grid refresh new text.
parsing class:
public class serverplayerparsing { servergridgenerator servergrid = new servergridgenerator (10, 10); public string validate(string command){ servergrid.framegen(); if (wordcount(command)== 3) { string[] commandarray = command.split(" "); commandparsing(commandarray); } else { system.out.println("error! format incorrect!"); system.out.println("correct format = [command 1] [command 2] [command 3]"); } return ""; } public int wordcount(string command){ string[] commandcount = command.split("\\s"); return commandcount.length; } public string commandparsing(string[] commandarray) { switch (commandarray[0]) { case "move": secondcommand (commandarray); break; default: system.out.println("error in first command!"); } return " "; } public string secondcommand (string commandarray[]) { switch (commandarray[1]) { case "forward": forwardmovement(commandarray); break; case "backward": backwardmovement (commandarray); break; case "left": leftmovement (commandarray); break; case "right": rightmovement (commandarray); break; default: system.out.println("error in second command!"); } return " "; } public string forwardmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveforward(1); break; case "2": servergrid.serverplayermoveforward(2); break; default: system.out.println("error in third command!"); } return " "; } public string backwardmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermovebackward(1); break; case "2": servergrid.serverplayermovebackward(2); break; default: system.out.println("error in third command!"); } return " "; } public string leftmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveleft(1); break; case "2": servergrid.serverplayermoveleft(2); break; default: system.out.println("error in third command!"); } return " "; } public string rightmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveright(1); break; case "2": servergrid.serverplayermoveright(2); break; default: system.out.println("error in third command!"); } return " "; } }
grid generator class:
import java.awt.color; import java.awt.container; import java.awt.dimension; import java.awt.gridlayout; import javax.swing.jbutton; import javax.swing.jframe; public class servergridgenerator extends jframe { public int serverplayerxpos = 0; public int serverplayerypos = 0; public int clientplayerxpos = 0; public int clientplayerypos = 9; public int endxpos = 9; public int endypos = 5; int row = 10; int column = 10; int sizegrid = 700; jbutton[][] squarebuttons = new jbutton [row][column]; public void framegen(){ servergridgenerator frame = new servergridgenerator(row, column); frame.setpreferredsize(new dimension(sizegrid, sizegrid)); frame.setlocationrelativeto(null); frame.pack(); frame.setvisible(true); } public servergridgenerator(int r, int c) { squarebuttons = new jbutton [r][c]; container pane = getcontentpane(); pane.setlayout(new gridlayout(r, c)); for(int y=0; y<c; y++){ (int x=0; x<r; x++) { squarebuttons[y][x] = new jbutton(""); squarebuttons[y][x].setopaque(true); squarebuttons[y][x].setbackground(color.white); squarebuttons[y][x].setenabled(false); pane.add(squarebuttons[y][x]); } } squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); squarebuttons[clientplayerypos][clientplayerxpos].settext(" p2"); squarebuttons[endypos][endxpos].settext(" end"); } public void serverplayermoveright (int moveby){ (int i=0; i<moveby; i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerxpos = serverplayerxpos + 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void serverplayermoveleft (int moveby){ (int i=0; i<moveby; i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerxpos = serverplayerxpos - 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void serverplayermoveforward (int moveby){ (int i=0; i<moveby; i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerypos = serverplayerypos + 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void serverplayermovebackward (int moveby){ (int i=0; i<moveby; i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerypos = serverplayerypos - 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } }
my issue can draw first " p1", " p2", " end" when parser calls methods moving forward, backward, left, right doesnt draw on grid, can explain why happens , can fix this?
thanks time
=================================================================================
edited:
i have realised im doing wrong , need call movements within gridgenerator/constructor method. have changed code , hard coded value , works, need make parser call drawing methods constructor , im having trouble that. please me call draw movements following example instead of hard coding values need them got parser.
import java.awt.color; import java.awt.container; import java.awt.dimension; import java.awt.gridlayout; import javax.swing.jbutton; import javax.swing.jframe; public class servergridgenerator extends jframe { public int serverplayerxpos = 0; public int serverplayerypos = 0; public int clientplayerxpos = 0; public int clientplayerypos = 9; public int endxpos = 9; public int endypos = 5; int row = 10; int column = 10; int sizegrid = 700; jbutton[][] squarebuttons = new jbutton [row][column]; //public serverplayerparsing serverpc = new serverplayerparsing(); public void framegen(){ servergridgenerator frame = new servergridgenerator(row, column); frame.setpreferredsize(new dimension(sizegrid, sizegrid)); frame.setlocationrelativeto(null); frame.pack(); frame.setvisible(true); } public servergridgenerator(int r, int c) { squarebuttons = new jbutton [r][c]; container pane = getcontentpane(); pane.setlayout(new gridlayout(r, c)); for(int y=0; y<c; y++){ (int x=0; x<r; x++) { squarebuttons[y][x] = new jbutton(""); squarebuttons[y][x].setopaque(true); squarebuttons[y][x].setbackground(color.white); squarebuttons[y][x].setenabled(false); pane.add(squarebuttons[y][x]); } } squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); squarebuttons[clientplayerypos][clientplayerxpos].settext(" p2"); squarebuttons[endypos][endxpos].settext(" end"); serverplayermoveright(6); // <============ hard coded value } public void serverplayermoveright (int moveby){ (int i=0; i<(moveby+1); i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerxpos = serverplayerxpos + 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); repaint(); validate(); } } public void serverplayermoveleft (int moveby){ (int i=0; i<(moveby+1); i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerxpos = serverplayerxpos - 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void serverplayermoveforward (int moveby){ (int i=0; i<(moveby+1); i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerypos = serverplayerypos + 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void serverplayermovebackward (int moveby){ (int i=0; i<(moveby+1); i++) { squarebuttons[serverplayerypos][serverplayerxpos].settext(" "); serverplayerypos = serverplayerypos - 1; squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); } } public void timedelay (){ try { thread.sleep(1000); } catch(interruptedexception ex) { thread.currentthread().interrupt(); } } }
the problem think creating multiple instances of frame seeing 1 of them. inside driver class have following code:
public class serverplayerparsing { servergridgenerator servergrid = new servergridgenerator (10, 10); public string validate(string command){ servergrid.framegen(); if (wordcount(command)== 3) { string[] commandarray = command.split(" "); commandparsing(commandarray); } else { system.out.println("error! format incorrect!"); system.out.println("correct format = [command 1] [command 2] [command 3]"); } return ""; }
notice how create servergridgenerator class level object inside validate command calling servergrid.framegen(). framegen has code:
public void framegen(){ servergridgenerator frame = new servergridgenerator(row, column); frame.setpreferredsize(new dimension(sizegrid, sizegrid)); frame.setlocationrelativeto(null); frame.pack(); frame.setvisible(true); }
so everytime call validate method creating instance of servergridgenerator frame , making frame visible. see if when execute multiple commands if getting multiple frames being created.
also noticed instance create servergrid never being shown, instance receiving movement commands.
=====edit in response request example=====
starting posted code servergridgenerator, made following changes constructor only, rest left as-is:
public servergridgenerator(int r, int c) { squarebuttons = new jbutton [r][c]; container pane = getcontentpane(); pane.setlayout(new gridlayout(r, c)); for(int y=0; y<c; y++){ (int x=0; x<r; x++) { squarebuttons[y][x] = new jbutton(""); squarebuttons[y][x].setopaque(true); squarebuttons[y][x].setbackground(color.white); squarebuttons[y][x].setenabled(false); pane.add(squarebuttons[y][x]); } } squarebuttons[serverplayerypos][serverplayerxpos].settext(" p1"); squarebuttons[clientplayerypos][clientplayerxpos].settext(" p2"); squarebuttons[endypos][endxpos].settext(" end"); /***** added these lines *******/ setpreferredsize(new dimension(sizegrid, sizegrid)); setlocationrelativeto(null); pack(); setvisible(true); }
and deleted method framegen unnecessary. in serverplayerparsing code, inside validate method removed call servergrid.framegen() since no longer present.
to test code, added main serverplayerparsing , input loop accept commands otherwise left code intact:
import java.io.*; public class serverplayerparsing { /*** need main test code ****/ static public void main(string[] args) throws exception { serverplayerparsing td = new serverplayerparsing(); td.go(); } /***** provides simple user prompt/input loop testing ****/ public void go() throws exception { datainputstream cin = new datainputstream(system.in); boolean running = true; string line; while(running) { system.out.printf("> "); line = cin.readline(); line = line.trim(); if(line.length() == 0) continue; if( line.equalsignorecase("exit") ) { running = false; continue; } system.out.println("validate: " + validate(line.tolowercase())); } system.exit(0); } /***** below original except framegen call ***/ servergridgenerator servergrid = new servergridgenerator (10, 10); public string validate(string command){ /** no longer needed servergrid.framegen(); */ if (wordcount(command)== 3) { string[] commandarray = command.split(" "); commandparsing(commandarray); } else { system.out.println("error! format incorrect!"); system.out.println("correct format = [command 1] [command 2] [command 3]"); } return ""; } public int wordcount(string command){ string[] commandcount = command.split("\\s"); return commandcount.length; } public string commandparsing(string[] commandarray) { switch (commandarray[0]) { case "move": secondcommand (commandarray); break; default: system.out.println("error in first command!"); } return " "; } public string secondcommand (string commandarray[]) { switch (commandarray[1]) { case "forward": forwardmovement(commandarray); break; case "backward": backwardmovement (commandarray); break; case "left": leftmovement (commandarray); break; case "right": rightmovement (commandarray); break; default: system.out.println("error in second command!"); } return " "; } public string forwardmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveforward(1); break; case "2": servergrid.serverplayermoveforward(2); break; default: system.out.println("error in third command!"); } return " "; } public string backwardmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermovebackward(1); break; case "2": servergrid.serverplayermovebackward(2); break; default: system.out.println("error in third command!"); } return " "; } public string leftmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveleft(1); break; case "2": servergrid.serverplayermoveleft(2); break; default: system.out.println("error in third command!"); } return " "; } public string rightmovement (string commandarray[]) { switch (commandarray[2]) { case "1": servergrid.serverplayermoveright(1); break; case "2": servergrid.serverplayermoveright(2); break; default: system.out.println("error in third command!"); } return " "; } }
this code work intended, can't see rest of code don't know how main interacting parser class.
the code cleaned quite bit. example, instead of passing string of various move... methods , switching on value parse 3rd command array element using integer.parseint(). if parse successful value integer, otherwise command bad. eliminate of move functions , handle in secondcommmand method this:
public string secondcommand (string commandarray[]) { int steps = -1; try { steps = integer.parseint(commandarray[2]) ; } catch(exception ex) { steps = -1; } if( steps == -1 || steps > 2) { system.out.println("error in third command."); } else { switch (commandarray[1]) { case "forward": servergrid.serverplayermoveforward(steps); break; case "backward": servergrid.serverplayermovebackward(steps); break; case "left": servergrid.serverplayermoveleft(steps); break; case "right": servergrid.serverplayermoveright(steps); break; default: system.out.println("error in second command!"); } } return " "; }
Comments
Post a Comment