fireEvent from Custom class

2019-08-07 00:10发布

问题:

I have the following class ProtokollEvent

public class ProtokollEvent extends Event {

//variable holds all devices in given protokoll
private ObservableList<Device> devicesList;

//variable holds SaveResult
private SaveResult result;

//final ProtokollEvents
public static final EventType<ProtokollEvent> PROTOKOLL_SAVE = new EventType(ANY, "PROTOKOLL_SAVE");
public static final EventType<ProtokollEvent> PROTOKOLL_SAVE_DONE = new EventType(ANY, "PROTOKOLL_SAVE_DONE");
public static final EventType<ProtokollEvent> PROTOKOLL_UPDATED = new EventType(ANY, "PROTOKOLL_UPDATED");
public static final EventType<ProtokollEvent> PROTOKOLL_DELETED = new EventType(ANY, "PROTOKOLL_DELETED");

public ProtokollEvent() {
    this(PROTOKOLL_SAVE);
}

public ProtokollEvent(EventType<? extends Event> arg0) {
    super(arg0);
}

public ProtokollEvent(Object arg0, EventTarget arg1, EventType<? extends Event> arg2) {
    super(arg0, arg1, arg2);
}

/**
 * getDevices will return current {@link Device} as ObservableList
 *
 * @return {@link ObservableList} of type {@link Device}
 */
public ObservableList getDev() {
    return devicesList;
}
/**
 * setDevices will set devicesList
 * @param devices ObservableList {@link Device}
 */
public void setDev(ObservableList devices) {
    this.devicesList = devices;
}
/**
 * get the result which is returned from calling saveProtokoll
 * @return result {@link SaveResult}
 */
public SaveResult getResult() {
    return result;
}
/**
 * set the result which is returned after calling saveMessprotokoll in RestCall
 * @param result {@link SaveResult}
 */
public void setResult(SaveResult result) {
    this.result = result;
}

}

in the second class

public class SaveUtils {

private MainWindowController controller;
private ObservableList<RowContainerPruefvorschriftController> rows;
private Protokoll lastSavedProtokoll;
private Protokoll currentSavingProtokoll;

public SaveUtils(MainWindowController control){
    this.controller = control;
}

private void startSaving(){
    currentSavingProtokoll = createProtokoll();
    boolean state = controller.networkOnline.get() ? saveOnline() :saveOffline();
}

public void setRows(ObservableList<RowContainerPruefvorschriftController> rows) {
    this.rows = rows;
    //if rows get set start saveing the data
    startSaving();
}

private boolean saveOffline(){
    return false;
}
private boolean saveOnline() {
    RestCall call = controller.getCall();
    //call saveMessprotokoll and look what SaveResult returns
    SaveResult result = call.saveMessprotokoll(currentSavingProtokoll);
    //create ProtokollEvent to tell all consumers if all was ok
    ProtokollEvent save = new ProtokollEvent(ProtokollEvent.PROTOKOLL_SAVE_DONE);
    save.setResult(result);
    //HOW to fire/dispatch the ProtokollEvent here??????
    //TODO: need to fire this event and listen for it in other classes
    if(result.getResult()>0){
        controller.setLoggerMessage("SavedOnline->Protokoll-Nr.:"+result.getProtokollnr());
    }
    else {
        controller.setLoggerMessage("SavedOnline not successful->Error:"+result.getError_message());
    }        
    return true;
}

}

in the saveOnline function i create a ProtokollEvent and pass it some values. What i now want is to fire or dispatch this event so other code parts could listen to this.

I tried with fireEvent() but as i understood the Oracle-DOCs only NODEs, Windows and Scene are able to do so. But how could i solve it with my custom class?

Additional i ask myself whats is the difference between fireEvent and dispatchEvent?

回答1:

Found the solution. All events could be fired through the static method

Event.fireEvent(EventTarget eventTarget,Event event)

where eventTarget specifies the path through which the event will travel (taken from java docs). So for my example i just added the following line

Event.fireEvent(controller.getMainWindowBorderPane(),save);

did it...