java - passing data between JPanels -
i'm making tetris in java , have game play on left , scoring, buttons, , nextpiece on right, so:

you'll notice score on game panel updating, score on score panel (on right) not.
on game panel, have global variables score , level: private int level, totalscore; initialized 0.
and in paint component():
g.setcolor(color.red); g.drawstring("level: " + level, this.getwidth()/2+110, this.getheight()/2-200); g.drawstring("score: " + totalscore, this.getwidth()/2+110, this.getheight()/2-170); then have code within game panel calculates level , scoring:
public void changelevel () { int max = (level+1)*100; if (totalscore >= max) { system.out.println(max + "reached... next level"); level++; totalscore = 0; timer(); } } public int tallyscore(int totallines) { int score = 0; switch (totallines) { case 1: score = 40 * (level + 1); break; case 2: score = 100 * (level + 1); break; case 3: score = 300 * (level + 1); break; case 4: score = 1200 * (level + 1); break; default: break; } return score; } //loop through rows starting @ bottom (12 rows) public void checkbottomfull() { int lines = 0; for(int row = totalrows-1; row > 0; row--) { while (isfull(row)) { lines++; clearrow(row); } } totalscore += tallyscore(lines); //check if level needs changed based on current score... changelevel(); //reset lines after score has been incremented lines=0; } and since want score panel display score, have these 2 methods in game panel return global variables:
public int getscore() { return totalscore; } public int getlevel() { return level; } in score panel paintcomponent() have board.getlevel() , board.getscore() (board class game panel) can feed game panel scores score panel.
g.setcolor(color.black); g.drawstring("level: " + board.getlevel(), this.getwidth()/2, this.getheight()/2-130); g.drawstring("score: " + board.getscore(), this.getwidth()/2, this.getheight()/2-100); yet can see picture, these scores not updating.
any thoughts?
thanks!
you want separate concerns can shared. consider making class logic , data underlies gui, , call class model class. can give level , score field , make them "bound properties", meaning other classes can listen changes these fields. giving model swingpropertychangesupport object , give addpropertychangelistener(propertychangelistener listener) , removepropertychangelistener(propertychangelistener listener), , notify registered propertychangelistener's of changes calling propertychangesupport's fire. e.g.,
import java.beans.propertychangelistener; import javax.swing.event.swingpropertychangesupport; public class model { public static final string score = "score"; public static final string level = "level"; private swingpropertychangesupport pcsupport = new swingpropertychangesupport(this); private int score; private int level; public void addpropertychangelistener(propertychangelistener listener) { pcsupport.addpropertychangelistener(listener); } public void removepropertychangelistener(propertychangelistener listener) { pcsupport.removepropertychangelistener(listener); } public int getscore() { return score; } public void setscore(int score) { int oldvalue = this.score; int newvalue = score; this.score = score; pcsupport.firepropertychange(score, oldvalue, newvalue); } public int getlevel() { return level; } public void setlevel(int level) { int oldvalue = this.level; int newvalue = level; this.level = level; pcsupport.firepropertychange(level, oldvalue, newvalue); } } then gui or view component wishes listen changes in values may so. below class combines "view" "control" if you're studying mvc structure:
import java.awt.flowlayout; import java.beans.propertychangeevent; import java.beans.propertychangelistener; import javax.swing.*; import javax.swing.event.changeevent; import javax.swing.event.changelistener; public class usemodelgui { private static void createandshowgui() { panel1 panel1 = new panel1(); panel2 panel2 = new panel2(); model model = new model(); panel1.setmodel(model); panel2.setmodel(model); jframe frame = new jframe("usemodelgui"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.getcontentpane().setlayout(new flowlayout()); frame.getcontentpane().add(panel1); frame.getcontentpane().add(panel2); frame.pack(); frame.setlocationbyplatform(true); frame.setvisible(true); } public static void main(string[] args) { swingutilities.invokelater(new runnable() { public void run() { createandshowgui(); } }); } } class panel1 extends jpanel { private jtextfield scorefield = new jtextfield(2); private jtextfield levelfield = new jtextfield(2); public panel1() { scorefield.setfocusable(false); scorefield.seteditable(false); levelfield.setfocusable(false); levelfield.seteditable(false); add(new jlabel("score:")); add(scorefield); add(new jlabel("level:")); add(levelfield); setborder(borderfactory.createtitledborder("check values")); } public void setmodel(model model) { model.addpropertychangelistener(new propertychangelistener() { @override public void propertychange(propertychangeevent pcevt) { if (model.level.equals(pcevt.getpropertyname())) { string level = pcevt.getnewvalue().tostring(); levelfield.settext(level); } else if (model.score.equals(pcevt.getpropertyname())) { string score = pcevt.getnewvalue().tostring(); scorefield.settext(score); } } }); } } class panel2 extends jpanel { private jspinner scorespinner = new jspinner(new spinnernumbermodel(0, 0, 20, 1)); private jspinner levelspinner = new jspinner(new spinnernumbermodel(0, 0, 10, 1)); private model model; public panel2() { add(new jlabel("score:")); add(scorespinner); add(new jlabel("level:")); add(levelspinner); setborder(borderfactory.createtitledborder("set values")); scorespinner.addchangelistener(new changelistener() { @override public void statechanged(changeevent evt) { int score = ((integer) scorespinner.getvalue()).intvalue(); if (model != null) { model.setscore(score); } } }); levelspinner.addchangelistener(new changelistener() { @override public void statechanged(changeevent evt) { int level = ((integer) levelspinner.getvalue()).intvalue(); if (model != null) { model.setlevel(level); } } }); } public void setmodel(model model) { this.model = model; } } the beauty of panel1 has no knowledge of panel2, , model has no knowledge of either. panel1 knows of if model changes. panel2 knows is changing model's state. model knows state can change, , values can listened to.
you're right in simple example over-kill, start having complex data , state, makes sense , becomes quite helpful.
Comments
Post a Comment