java - How to update a JLabel when a JLabel in another class updates? -


i've hit roadblock on 1 , hoping insight.

here's basic gist of i'm trying accomplish:

-i have piece class (extending jpanel) has array of jradiobutton, jlabel updates according button selected. part works fine.

-i have "master" jframe class calls couple different pieces , puts them on frame - did keep things getting unwieldy, it's easier have each piece own class.

-for various purposes, want put jlabel on master frame shows button selected - in essence, want put jlabel copycat of 1 in piece class , updates whenever piece label does. don't know if i'm being dumb can't 1 on master update whenever piece 1 - stays @ initial one. there way have label update whenever other 1 does?

"piece" (basic example, not real thing):

import java.awt.*; import java.awt.event.*;  import javax.swing.*; import javax.swing.event.*;  import java.util.*;  public class piece2 extends jpanel {      //variables     final jlabel on = new jlabel("none");      string names[] = {     "button 1","button 2","button 3"     };      private actionlistener buttonaction = new actionlistener(){         public void actionperformed (actionevent ae){             string buttontext = ((jradiobutton) ae.getsource()).gettext();             on.settext(buttontext);         }     };      void createlist(){          box contentpanel = box.createverticalbox();         buttongroup buttons123 = new buttongroup();          final jradiobutton choicebuttons[]=new jradiobutton[names.length];         for(int i=0;i<(names.length);i++){             choicebuttons[i] = new jradiobutton(names[i]);             choicebuttons[i].addactionlistener(buttonaction);             buttons123.add(choicebuttons[i]);             contentpanel.add(choicebuttons[i]);         }         contentpanel.add(on);          this.add(contentpanel);         setvisible(true);      };      public static void main(string[] args) {         // todo auto-generated method stub         new piece2().createlist();      }      } 

"master" (again, bare-bones example):

import java.awt.*; import java.awt.event.*;  import javax.swing.*; import javax.swing.timer; import javax.swing.event.*;  import java.util.*;   public class collectgui extends jframe{     jlabel p2on = new jlabel("none");      private void createdialog(){         this.setsize(2000,1000);         this.setlocation(0,0);         this.settitle("title");         jpanel mainpanel = new jpanel();         mainpanel.setlayout(new borderlayout());          final piece2 piece = new piece2();         piece.createlist();         mainpanel.add(piece, borderlayout.west);          //this part stuck         p2on.settext(piece.on.gettext());         //i know sets once, how update when on does?          mainpanel.add(p2on, borderlayout.east);         this.add(mainpanel);         this.setvisible(true);     }      public static void main(string[] args) {         // todo auto-generated method stub         new collectgui().createdialog();     }  } 

so said can label on there , set once, haven't figured out how update whenever on does... there way "append" piece-class action listener master class? or kind of listener can add p2on label listens when on label changes? i'm pretty stumped. thank help!!

you use kind of observer pattern, both jpanel , frame use common object/model make changes current state of game, provides event notifications 2 can update accordingly

this related model-view-controller, allow separate visuals logic, decoupling code

i'd prefer have model controlled logic , notified interested parties, in case, "could" use propertychangelistener...

so, in piece2 class's actionlistener, need trigger property change event...

private actionlistener buttonaction = new actionlistener() {     public void actionperformed(actionevent ae) {         string buttontext = ((jradiobutton) ae.getsource()).gettext();         on.settext(buttontext);         firepropertychange("button", null, buttontext);     } }; 

and in collectiongui, monitor event

piece.addpropertychangelistener("button", new propertychangelistener() {     @override     public void propertychange(propertychangeevent evt) {         p2on.settext(piece.on.gettext());     } }); 

i'd discourage extending directly top level container jframe, locks single use-case , reduces re-usability of class , you're not adding new functionality class either


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -