user interface - JavaFX 2 -- Setting the defaultButton property: mutually exclusive? -


in visual basic 6, if set defaultbutton property of form button control true, same property on other button controls in form set false, i.e. property mutually exclusive (like radio button).

i getting behavior on gui seems indicate more 1 button in javafx may have defaultbutton property set true, , more 1 button receive vk_enter button events system.

the javafx 2.2 documentation setdefaultbutton() method , defaultbutton property not clarify issue.

i have 1 anchorpanel bunch of controls , separate bunch of controls. these shown on same stage, , 1 setvisible(true) user depends on information he's working with.

i'm wondering if need iterate through button controls on active panes , set defaultbutton property false of them before try set 1 true in order avoid odd behavior resulting more 1 button receiving enter key events.

edit 05/05/2013 -- here changelistener code have. had written anonymous inner class attaching directly focusedproperty of textfield control txtdx. however, thought maybe fix error removing listener during times when didn't want firing (i.e., when pane invisitble or disabled). moved listener inner class , have instance of referenced instance variable. having reference allows me add , remove listener depending on pane displayed.

anyway, here listener class:

private class focuspropertychangelistener implements changelistener<boolean> {      focuspropertychangelistener() { system.out.println("new fpcl instance"); }      @override     public void changed(observablevalue<? extends boolean> ov,          boolean oldb, boolean newb) {         system.out.println("focus change triggered");          if (ancenceditor.isvisible() && !ancenceditor.isdisabled()) {             boolean b = (newb != null && newb.booleanvalue() == true);             system.out.println("txtdx focus change event triggered: dxadd = " + b);              btnwindowcommit.setdefaultbutton(!b);             btnwindowclose.setcancelbutton(true);             btndxadd.setdefaultbutton(b);         }     } } 

as can see, in event handler make 2 (presumably concurrent) calls setdefaultbutton. intent use btndxadd if editing in txtdx, otherwise use btnwindowcommit. i'll try getting rid of presumably unneeded calls setdefaultbutton , see if still concurrentmodificationexceptions.

edit 05/05/2013 -- adding stack trace. here goes...

java.util.concurrentmodificationexception @ java.util.hashmap$hashiterator.nextentry(hashmap.java:894) @ java.util.hashmap$entryiterator.next(hashmap.java:934) @ java.util.hashmap$entryiterator.next(hashmap.java:932) @ com.sun.javafx.collections.observablemapwrapper$observableentryset$1.next(observablemapwrapper.java:560) @ com.sun.javafx.collections.observablemapwrapper$observableentryset$1.next(observablemapwrapper.java:548) @ com.sun.javafx.scene.keyboardshortcutshandler.processaccelerators(keyboardshortcutshandler.java:286) @ com.sun.javafx.scene.keyboardshortcutshandler.dispatchbubblingevent(keyboardshortcutshandler.java:119) @ com.sun.javafx.event.compositeeventdispatcher.dispatchbubblingevent(compositeeventdispatcher.java:38) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:37) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.eventutil.fireeventimpl(eventutil.java:53) @ com.sun.javafx.event.eventutil.fireevent(eventutil.java:28) @ javafx.event.event.fireevent(event.java:171) @ javafx.scene.scene$keyhandler.process(scene.java:3513) @ javafx.scene.scene$keyhandler.access$2300(scene.java:3472) @ javafx.scene.scene.impl_processkeyevent(scene.java:1904) @ javafx.scene.scene$scenepeerlistener.keyevent(scene.java:2270) @ com.sun.javafx.tk.quantum.glassvieweventhandler$keyeventnotification.run(glassvieweventhandler.java:136) @ com.sun.javafx.tk.quantum.glassvieweventhandler$keyeventnotification.run(glassvieweventhandler.java:100) @ java.security.accesscontroller.doprivileged(native method) @ com.sun.javafx.tk.quantum.glassvieweventhandler.handlekeyevent(glassvieweventhandler.java:163) @ com.sun.glass.ui.view.handlekeyevent(view.java:518) @ com.sun.glass.ui.view.notifykey(view.java:951) @ com.sun.glass.ui.win.winapplication._enternestedeventloop(native method) @ com.sun.glass.ui.application.enternestedeventloop(application.java:383) @ com.sun.glass.ui.eventloop.enter(eventloop.java:83) @ com.sun.javafx.tk.quantum.quantumtoolkit.enternestedeventloop(quantumtoolkit.java:520) @ javafx.stage.stage.showandwait(stage.java:397) @ org.kls.md.censusassistant.dialogcontroller.showandwait(dialogcontroller.java:94) @ org.kls.md.censusassistant.dcmaineditor.handleencdetails(dcmaineditor.java:287) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ sun.reflect.misc.trampoline.invoke(methodutil.java:75) @ sun.reflect.generatedmethodaccessor1.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ sun.reflect.misc.methodutil.invoke(methodutil.java:279) @ javafx.fxml.fxmlloader$controllermethodeventhandler.handle(fxmlloader.java:1435) @ com.sun.javafx.event.compositeeventhandler.dispatchbubblingevent(compositeeventhandler.java:69) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:217) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:170) @ com.sun.javafx.event.compositeeventdispatcher.dispatchbubblingevent(compositeeventdispatcher.java:38) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:37) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.eventutil.fireeventimpl(eventutil.java:53) @ com.sun.javafx.event.eventutil.fireevent(eventutil.java:28) @ javafx.event.event.fireevent(event.java:171) @ javafx.scene.node.fireevent(node.java:6863) @ javafx.scene.control.button.fire(button.java:179) @ com.sun.javafx.scene.control.behavior.buttonbehavior.mousereleased(buttonbehavior.java:193) @ com.sun.javafx.scene.control.skin.skinbase$4.handle(skinbase.java:336) @ com.sun.javafx.scene.control.skin.skinbase$4.handle(skinbase.java:329) @ com.sun.javafx.event.compositeeventhandler.dispatchbubblingevent(compositeeventhandler.java:64) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:217) @ com.sun.javafx.event.eventhandlermanager.dispatchbubblingevent(eventhandlermanager.java:170) @ com.sun.javafx.event.compositeeventdispatcher.dispatchbubblingevent(compositeeventdispatcher.java:38) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:37) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.basiceventdispatcher.dispatchevent(basiceventdispatcher.java:35) @ com.sun.javafx.event.eventdispatchchainimpl.dispatchevent(eventdispatchchainimpl.java:92) @ com.sun.javafx.event.eventutil.fireeventimpl(eventutil.java:53) @ com.sun.javafx.event.eventutil.fireevent(eventutil.java:33) @ javafx.event.event.fireevent(event.java:171) @ javafx.scene.scene$mousehandler.process(scene.java:3328) @ javafx.scene.scene$mousehandler.process(scene.java:3168) @ javafx.scene.scene$mousehandler.access$1900(scene.java:3123) @ javafx.scene.scene.impl_processmouseevent(scene.java:1563) @ javafx.scene.scene$scenepeerlistener.mouseevent(scene.java:2265) @ com.sun.javafx.tk.quantum.glassvieweventhandler$mouseeventnotification.run(glassvieweventhandler.java:250) @ com.sun.javafx.tk.quantum.glassvieweventhandler$mouseeventnotification.run(glassvieweventhandler.java:173) @ java.security.accesscontroller.doprivileged(native method) @ com.sun.javafx.tk.quantum.glassvieweventhandler.handlemouseevent(glassvieweventhandler.java:292) @ com.sun.glass.ui.view.handlemouseevent(view.java:528) @ com.sun.glass.ui.view.notifymouse(view.java:922) @ com.sun.glass.ui.win.winapplication._runloop(native method) @ com.sun.glass.ui.win.winapplication.access$100(winapplication.java:29) @ com.sun.glass.ui.win.winapplication$3$1.run(winapplication.java:73) @ java.lang.thread.run(thread.java:722) 

edit 05/05/2013 -- altered code no longer clearing former settings of defaultbutton, i.e. 1 call setdefaultbutton(true). idea since backing code performs operation using runnable, -perhaps- cause of concurrentmodificationexceptions getting.

so, appear in fact no longer able trigger concurrentmodificationexceptions in code when attempt change between btndxadd , btnwindowcommit default button.

however ...

i no longer able behavior want. when editing in txtdx control now, can press enter key day , button not fire. have confirmed focusproperty changelistener fired , single call txtdx.setdefaultbutton(true) made. regardless, not able behavior want.

bug javadoc clarification : javafx-jira.kenai.com/browse/rt-30200

bug implementation : https://javafx-jira.kenai.com/browse/rt-30206

i watched code skin class, observable openjfx:

what happening, when setdefault(true/false):

runnable defaultbuttonrunnable = new runnable() {         public void run() {             if (!getskinnable().isdisabled()) {                 getskinnable().fire();             }         }     };  private void setdefaultbutton(boolean value) {      keycode acceleratorcode = keycode.enter;     defaultacceleratorkeycodecombination =              new keycodecombination(acceleratorcode);      if (! value) {         /*         ** first check of there's default button         */         runnable olddefault = getskinnable().getparent().getscene().getaccelerators().get(defaultacceleratorkeycodecombination);         if (!defaultbuttonrunnable.equals(olddefault)) {             /*             ** us?             */             getskinnable().getparent().getscene().getaccelerators().remove(defaultacceleratorkeycodecombination);         }     }     getskinnable().getparent().getscene().getaccelerators().put(defaultacceleratorkeycodecombination, defaultbuttonrunnable); } 

how works : when set new button default, finds existing default button, , removes acelerator on enter key press acelerators list stored @ scene. , adds default button. don't need setdefault on other buttons.


Comments

Popular posts from this blog

Perl - how to grep a block of text from a file -

delphi - How to remove all the grips on a coolbar if I have several coolbands? -

javascript - Animating array of divs; only the final element is modified -