user3396729
user3396729

Reputation: 69

Dispatch an event to main java

I have a CountDownTimer class that when it finishes counting down it should dispatch an event to main java (or any class that uses it) letting it know it has finished.

Here is my class:

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Label;

public class CountTimer {

    private Label targetText;
    private String direction;
    private int minutes;
    private int seconds;
    private int totalSeconds;
    private int timeTotal;
    private int timeLoaded;
    private Boolean test;

    Timer timer;


    public CountTimer(int min,int sec,String dir,Label targetTextField)
    {
        minutes = min * 60;
        seconds = sec;
        timeTotal = minutes + seconds;
        if (dir == "down") {
            totalSeconds = minutes + seconds;
        }
        else {
            totalSeconds = 0;
        }
        if (targetTextField != null) {
            targetText = targetTextField;
        }
        direction = dir;
    }

    public void start()
    {
        timer = new Timer(){
            public void run(){  
                timeLoaded +=  1;

                if (direction == "up") {
                    totalSeconds++;
                }
                else {
                    totalSeconds--;
                }

                seconds = totalSeconds % 60;
                minutes = (int) Math.floor(totalSeconds / 60);
                String minutesDisplay = (minutes < 10) ? "0" + Integer.toString(minutes) : Integer.toString(minutes);
                String secondsDisplay= (seconds < 10) ? "0" + Integer.toString(seconds): Integer.toString(seconds);
                if (targetText != null) {
                    targetText.setText( minutesDisplay + ":" + secondsDisplay);
                }
                if (test=true)  {
                    consoleLog(minutesDisplay + ":" + secondsDisplay);  
                }

                if(timeTotal == timeLoaded) {
                    //DISPATCH CUSTOM EVENT TO MAIN.JAVA HERE
                    Window.alert("OK");
                    timer.cancel();
                }
            }
        };

        timer.scheduleRepeating(1000);        
    }

    public int getTimeTotal()
    {
        return timeTotal;
    }

    public int getTimeLoaded()
    {
        return timeLoaded;
    }

    public int getProg()
    {
        return (int) Math.floor(timeLoaded/timeTotal*100);
    }

    public native final void consoleLog(String msg)/*-{
    console.log(msg);
}-*/;

}

Please help, how can i do this?

Upvotes: 0

Views: 96

Answers (2)

Andrei Volgin
Andrei Volgin

Reputation: 41089

There are several options.

If you have this requirement frequently, or you need to notify multiple Activities/widgets, you may consider using an EventBus:

How to use the GWT EventBus

Alternatively, your CountTimer can simply call a public static method in your main class:

MyApp.doSomething();

Upvotes: 1

Chuck Lowery
Chuck Lowery

Reputation: 933

I believe you are looking to implement the Publish-Subscribe pattern. http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern

You can allow your object to have subscribers register with it. Once you have finished your operation it can then notify the subscribers that it has finished.

Example:

public interface Subscriber {
    public void notify();
}

public class Publisher {
    private ArrayList<Subscriber> subscribers = new ArrayList<>();

    public void addSubscriber(Subscriber s) {
        subscribers.add(s);
    }

    public void doWork() {
        System.sleep(100);
            notifyAll();
    }

    private void notifyAll() {
        for(Subscriber s : subscribers) {
            s.notify();
        }
    }
} 

Upvotes: 2

Related Questions