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 piece
s , 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
Post a Comment