Observer Pattern used with Java socket programing not working -
i have problem observer pattern when i'm trying update client view based on data comes server.
the code sends messages client:
package model; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.socket; public class playerthread extends thread{ private bufferedreader infromclient; private printwriter outtoclient; private socket socket; public playerthread(socket socket) throws ioexception{ this.socket = socket; infromclient = new bufferedreader(new inputstreamreader(socket.getinputstream())); outtoclient = new printwriter(socket.getoutputstream(), true); outtoclient.println("hey"); } public void run(){ // needs implemented } }
the code takes care of recieving data on client side:
package connection; import java.io.bufferedreader; import mediator.modelmanager; public class clientrecieverthread extends thread { private modelmanager model; private bufferedreader infromserver; public clientrecieverthread(modelmanager model, bufferedreader infromserver) { this.model = model; this.infromserver = infromserver; } @override public void run() { string message = null; try { while (true) { message = infromserver.readline(); //system.out.println(message); model.setmessage(message); } } catch (exception e) { } }
}
and code contains observer pattern use on client side:
package model; public class messagehandler { private string message; public messagehandler(){ message = "welcome"; } public void setmessage(string message){ this.message = message; } public string getmessage(){ return this.message; } } package mediator; import java.io.ioexception; import java.net.unknownhostexception; import java.util.observable; import model.messagehandler; import connection.proxy; public class modelmanager extends observable{ private messagehandler messagehandler; private proxy proxy; // establish connection server public modelmanager() throws unknownhostexception, ioexception{ proxy = new proxy(this); messagehandler = new messagehandler(); } public synchronized void setmessage(string message){ setchanged(); messagehandler.setmessage(message); notifyobservers(message); } public string getmessage(){ return messagehandler.getmessage(); } public void send(string message){ proxy.send(message); } } package view; import java.awt.borderlayout; import java.awt.graphics; import java.awt.graphics2d; import java.awt.rectangle; import java.util.observable; import java.util.observer; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.swingconstants; import model.board; public class view extends jpanel implements observer{ private jframe frame; private board board; private rectangle[][] squares; private jlabel messagelabel; public view(){ initcomponents(); initvariables(); addcomponents(); } private void initcomponents() { frame = new jframe("tictactoe"); frame.setsize(500, 500); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setlocationrelativeto(null); messagelabel = new jlabel(""); messagelabel.sethorizontalalignment(swingconstants.center); messagelabel.setverticalalignment(swingconstants.center); this.setsize(300,300); } private void initvariables() { board = new board(3,3, 100); squares = new rectangle[board.getrow()][board.getcol()]; (int = 0; < squares.length; i++){ (int j = 0; j < squares[i].length; j++){ squares[i][j] = new rectangle(); } } } private void addcomponents() { frame.add(messagelabel, borderlayout.north); frame.add(this); frame.setvisible(true); } private void drawboard(graphics g, board board) { int positionx = this.getwidth()/2 - (board.getcellsize() + board.getcellsize()/2); int positiony = 50; graphics2d g2d = (graphics2d) g; (int = 0; < board.getrow(); i++) { (int j = 0; j < board.getcol(); j++) { squares[i][j] = new rectangle(positionx, positiony, 100, 100); positionx += 100; g2d.draw(squares[i][j]); } positiony += board.getcellsize(); positionx = this.getwidth()/2 - (board.getcellsize() + board.getcellsize()/2); } } public void paintcomponent(graphics g){ drawboard(g, board); } public void update(observable o, object arg) { system.out.println((string)arg); } }
the connection between modelmanager
, view
done in controller
class (model.addobserver(view)
);
the prolem don't understand why view doesn't updated, although data gets recieved client.
thank in advance! :)
you need call method notifyobservers();
when model changed, notify observers added model.
so inside setmessage(string message)
, coding:
if(this.message!=message){ this.message = message; notifyobservers(); }
Comments
Post a Comment