java - Listener running before action -
i have made custom jcombobox
. using jpopupmenu
containing jcheckboxmenuitem
. apparently popupmenulistener
popupmenuwillbecomeinvisible
running before jcheckboxmenuitem
changed. ideas how fix? not add listeners jcheckboxmenuitem
.
public class listenertest extends jframe implements actionlistener, popupmenulistener { private jpopupmenu menu; private list<jcheckboxmenuitem> menuitems; private jcheckboxmenuitem i1; private jcheckboxmenuitem i2; private jcheckboxmenuitem i3; public listenertest(){ // create button jbutton b = new jbutton("click me!"); b.addactionlistener(this); // create popupmenu menu = new jpopupmenu(); menu.addpopupmenulistener(this); // add checkboxes popupmenu menuitems = new linkedlist<jcheckboxmenuitem>(); i1 = new jcheckboxmenuitem("1"); i2 = new jcheckboxmenuitem("2"); i3 = new jcheckboxmenuitem("3"); menu.add(i1); menu.add(i2); menu.add(i3); this.add(b); this.setdefaultcloseoperation(exit_on_close); this.pack(); this.setvisible(true); } public static void main(string[] args){ new listenertest(); } @override public void actionperformed(actionevent e) { // show popupmenu when button clicked menu.show(this, 0, this.getheight()); } @override public void popupmenuwillbecomevisible(popupmenuevent e) {} @override public void popupmenuwillbecomeinvisible(popupmenuevent e) { // check checkboxes checked when popup menu closed(currently 1 step behind) system.out.println(i1.isselected()); system.out.println(i2.isselected()); system.out.println(i3.isselected()); } @override public void popupmenucanceled(popupmenuevent e) {} }
one "possible" solution vs. kludge, use popupmenuwillbecomeinvisible(...)
queue checking of state onto swing event queue performs action later, after items on event queue have finished. not guaranteed work however.
@override public void popupmenuwillbecomeinvisible(popupmenuevent e) { swingutilities.invokelater(new runnable() { public void run() { system.out.println(i1.isselected()); system.out.println(i2.isselected()); system.out.println(i3.isselected()); } }); }
Comments
Post a Comment