java - Tab in JTabbedPane does not reflect changes on button press -
within tab of gui, user allowed edit employee's name. name serves tab's label, when change confirmed tab should updated reflect change , new data written data file.
the employees stored in hashmap
in class employees
. tabs populated iterating through arraylist<string>
of employees' names, gotten calling method employees.getnames()
. gui, user can type in new name , press change name button. button's actionlistener
calls method changename()
, replaces old name new name in hashmap
, updates data file.
this works correctly first time user wants change employee's name, subsequent changes yield error. appears jpanel
contains jtextfields
(see getemployeeinfopanel()
below) not updating parameter name
. parameter employee's current name, while new name gotten jtextfield
.
an example illustrate problem below. essentially, steps are:
1. old name = mary provided when program starts 2. user changes name in jtextfield, oldname = mary , newname = mary s. 3. @ point, oldname should update mary s. new key. however, oldname remains mary hashmap cannot updated again.
the hierarchy of particular screen is:
jframe (entire application) | -- jpanel employeespanel (this screen) | | | -- jpanel (for custom menu bar) | | | -- jtabbedpane (one tab each employee) | | | -- jpanel (contains jlabels, jtextfield, etc employee) | -- .....
and here relevant code gui:
public class employeespanel { private jtabbedpane pane; private employees employees; ... public employeespanel(jpanel panel, container cards) { ... pane = new jtabbedpane(); getemployees(); } private void getemployees() { ... employees = new employees(properties, employees_txt); //arraylist of employees' names names = employees.getnames(); for(string name : names) { pane.addtab(name, getemployeeinfopanel(name)); } pane.addtab("new employee", addemployeepanel()); } public jpanel addemployeepanel() { ... } private jpanel getemployeeinfopanel(final string name) throws employeeexception { jpanel infopanel = new jpanel(); infopanel.setlayout(new boxlayout(infopanel, boxlayout.page_axis)); jlabel namelabel = new jlabel("employee name"); jlabel wagelabel = new jlabel("employee wage"); final jtextfield namefield = new jtextfield(name, 30); final jtextfield wagefield = new jtextfield(employees.getwage(name).tostring(), 30); jbutton changenamebutton = new jbutton("change name"); jbutton changewagebutton = new jbutton("change wage"); changenamebutton.addactionlistener(new actionlistener() { public void actionperformed(actionevent arg0) { try { string newname = namefield.gettext(); employees.changename(name, newname); panel.validate(); } catch (employeeexception e) { // todo create popup warning } } }); ... return infopanel; } }
and here code class employees changes hashmap:
public void changename(string oldname, string newname) throws employeeexception { system.out.println("old name = " + oldname + ", new name = " + newname); if(employees.containskey(oldname)) { bigdecimal wage = employees.get(oldname); employees.remove(oldname); employees.put(newname, wage); names.remove(oldname); names.add(newname); prop.remove(oldname); prop.setproperty(newname, wage.tostring()); saveproperties(); system.out.println(names); } else { throw new employeeexception("could not change name because employee not exist."); } }
here example. first screen shot when program started; employee names populated appropriate tabs. second screen shot after attempting change employee's name. can see, tab's label has not changed, assumed call validate()
do.
(before)
(after pressing button)
and finally, output pressing change name button twice produces, showing name has been changed in arraylist:
old name = mary, new name = mary s. [jane, bob, sue, mary s.] old name = mary, new name = mary s. 653647 [awt-eventqueue-0] error employees.employeeexception - not change name because employee not exist.
you may looking settitleat()
method.
addendum: comparison, here's sscce allows multiple edits.
import java.awt.dimension; import java.awt.eventqueue; import java.awt.event.actionevent; import javax.swing.abstractaction; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jtabbedpane; import javax.swing.jtextfield; /** * @see http://stackoverflow.com/a/11007109/230513 */ public class tabedit extends jpanel { private static final int max = 5; private static final string name = "tab "; private final jtabbedpane pane = new jtabbedpane(); public tabedit() { (int = 0; < max; i++) { pane.add(name + string.valueof(i), new tabcontent(i)); } this.add(pane); } private class tabcontent extends jpanel { private tabcontent(final int i) { final jtextfield jtf = new jtextfield( "please edit name of " + name + string.valueof(i)); this.add(jtf); jtf.addactionlistener(new abstractaction() { @override public void actionperformed(actionevent e) { pane.settitleat(i, jtf.gettext()); } }); } @override public dimension getpreferredsize() { return new dimension(320, 120); } } private void display() { jframe f = new jframe("tabedit"); f.setdefaultcloseoperation(jframe.exit_on_close); f.add(this); f.pack(); f.setlocationrelativeto(null); f.setvisible(true); } public static void main(string[] args) { eventqueue.invokelater(new runnable() { @override public void run() { new tabedit().display(); } }); } }
Comments
Post a Comment