On Mon, Dec 16, 2013 at 1:07 AM, Scott Palmer <swpal...@gmail.com> wrote: > Interesting, no worse than John's pattern though. > I thought of using a try/finally to make sure release was called and that > naturally lead to thinking of try-with-resources, where the "resource" in > this case is a binding of some sort (or a wrapper around a binding) that is > invalidated on close() if needed.
That is an interesting idea. I didn't intend blockWhile() to be safe with respect to exceptions, but merely void blockWhile(Runnable r) { block(); r.run(); release(); } Enhancement you are suggesting could be fleshed out as block() returning an AutoCloseable and the usage would be try(AutoCloseable a = relaxedArea.block()) { obj.setWidth(w); obj.setHeight(h); } I wish I could omit the "AutoCloseable a = " when I don't use "a" inside the try block. Regards, Tomas > > > Scott > > > > On Sun, Dec 15, 2013 at 6:57 PM, Tomas Mikula <tomas.mik...@gmail.com> > wrote: >> >> On Sun, Dec 15, 2013 at 11:49 PM, Tomas Mikula <tomas.mik...@gmail.com> >> wrote: >> > On Sun, Dec 15, 2013 at 6:39 PM, Scott Palmer <swpal...@gmail.com> >> > wrote: >> >> Interesting idea. >> >> >> >> There is a case I have been curious about and wonder what the best >> >> practices >> >> are for it. Suppose you have a case when you are changing multiple >> >> different properties that will be used in a single calculation. You >> >> want to >> >> deal with a single change to all of them in one go. E.g. imagine you >> >> have >> >> an "area" property that is bound to both "width" and "height". You >> >> want to >> >> write code like: >> >> >> >> obj.setWidth(w); >> >> obj.setHeight(h); >> >> >> >> and have only ONE recalculation of the area property happen. Currently >> >> the >> >> way bindings work the area will be calculated twice. The intermediate >> >> calculation is really not a value that you ever want to observe. >> > >> > Hi Scott, >> > >> > this is precisely the problem that I'm trying to address here. Now, >> > the question is whether you have control over the implementation of >> > obj. >> > >> > If yes, then it is the same case as the AND gate "motivational >> > example" from InhiBeans page. You provide a method setSize(w, h) and >> > use block()/release() to implement it in a way that causes only one >> > change of the area property. >> > >> > If you cannot change the implementation of obj, what you can do is to >> > bind an inhibeans.binding.DoubleBinding to the "area" value, call it >> > relaxedArea, and listen to that one for all your purposes. >> > Then you resize obj like this: >> > >> > relaxedArea.block(); >> > obj.setWidth(); >> > obj.setHeight(); >> > relaxedArea.release(); >> >> I just thought of an enhancement: add method blockWhile(Runnable). >> >> The above example would become >> >> relaxedArea.blockWhile(() -> { >> obj.setWidth(w); >> obj.setHeight(h); >> }); >> >> This way you wouldn't have to worry about forgetting to call >> release(), but comes with a penalty of creating a closure. >> >> Regards, >> Tomas >> >> > >> > Only one change of relaxedArea is emitted. >> > >> > Best, >> > Tomas >> > >> >> >> >> Are there helpers for this sort of situation? Are there guidelines in >> >> the >> >> JavaFX docs somewhere? >> >> >> >> Regards, >> >> >> >> Scott >> >> >> >> >> >> On Sat, Dec 14, 2013 at 11:54 PM, Tomas Mikula <tomas.mik...@gmail.com> >> >> wrote: >> >>> >> >>> Hello, >> >>> >> >>> I just published a small extension of javafx bindings and properties >> >>> that can help you reduce redundant recalculations. >> >>> >> >>> They provide two additional methods: >> >>> >> >>> public void block(); >> >>> public void release(); >> >>> >> >>> Call p.block() when you suspect your actions will lead to multiple >> >>> invalidations of p, and call p.release() when you are done and want to >> >>> deliver a single invalidation notification to p's observers. >> >>> >> >>> https://github.com/TomasMikula/InhiBeans >> >>> >> >>> Regards, >> >>> Tomas >> >> >> >> > >