Get source from DataChangeEvent [message #1856078] |
Sun, 20 November 2022 11:04 |
Mr Robot Messages: 70 Registered: March 2020 |
Member |
|
|
Hello,
I was playing with dataChange events, and have one question.
This is example I was working on:
1. Example
Send event
ItemDataChangeEvent event = new ItemDataChangeEvent(invoiceObject, Invoice.class, ChangeStatus.Inserted, null, null);
IDesktop.CURRENT.get().fireDataChangeEvent(event);
Attach listeners
@Override
protected void execInitForm() {
registerDataChangeListener(Invoice.class);
}
Reload data on when event is fired
@Override
protected void execDataChanged(Object... dataTypes) {
fetchInvoices();
}
Everything is working ok, but my question is: How can I fetch source object from event in this example?
2. Example
I tried with another way, creating listener and geting event as parameter like this:
@Override
protected void execInitForm() {
IDesktop.CURRENT.get().addDataChangeListener(new DataChangeListener(){
//use dataChanged metod and get the event.
});
}
This example works also, but problem is listeners is registered everytime when I open form. So if I open and close form 6 times, listener will fire dataChange 6 times, even if I have:
unregisterDataChangeListener(Invoice.class);
on execDisposeForm...
Do I need manualy delete all listeners of that event in execInit and register it again to work?
Thank you
|
|
|
Re: Get source from DataChangeEvent [message #1856386 is a reply to message #1856078] |
Thu, 08 December 2022 09:57 |
|
Unforunately, you can't access the event data in execDataChanged(). This is a convenience function with a limited API. But you can easily add your own IDataChangeListener to the desktop. The dataChanged() callback gives you full access to the original event.
Your implementation is almost correct. Yes, you add the listener in execInitForm(), and remove it again in execDisposeForm(). However, you need to unregister the same listener instance.
Something like this:
public class MyForm extends AbstractForm {
protected final IDataChangeListener m_dataChangeListener = this::dataChanged;
@Override
protected void execInitForm() {
super.execInitForm();
IDesktop desktop = IDesktop.CURRENT.get();
if (desktop != null) {
desktop.addDataChangeListener(m_dataChangeListener);
}
}
@Override
protected void execDisposeForm() {
super.execDisposeForm();
IDesktop desktop = IDesktop.CURRENT.get();
if (desktop != null) {
desktop.removeDataChangeListener(m_dataChangeListener);
}
}
protected void dataChanged(DataChangeEvent event) {
if (event instanceof MyCustomEvent) {
// handle event
}
}
}
Regards,
Beat
|
|
|
Powered by
FUDForum. Page generated in 0.03097 seconds