java - passing data between JPanels -


i'm making tetris in java , have game play on left , scoring, buttons, , nextpiece on right, so:

enter image description here

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

Popular posts from this blog

Change php variable from jquery value using ajax (same page) -

Pull out data related to my apps from Android Play Store and iOS App Store -

How can I fetch data from a web server in an android application? -