从计时器类返回值

时间:2017-01-04 18:21:23

标签: java swing timer

我正在研究一个计时器类,我想用它在一定的秒数后从一个单词中一次返回一个字符。基本上我想在JPanel中的另一个类中显示字符,并在一秒左右后更改我显示的字母。我可以把它写在同一个类的System.out.println中的字符中,但是如果我只想一次返回一个字符,我不知道如何将它用于另一个类。时间间隔。我无法从run-method返回任何内容,因为它是无效的,所以任何有关我如何解决这个问题的帮助将不胜感激。

package GU4;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
    Timer timer;
    private String name;
    private int i = 0;
    public TimerTest(int seconds, String name){
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000, 1000);
        this.name = name;

    }
    class RemindTask extends TimerTask{

        public void run() {
            int length = name.length();
            if(i < length){         
            System.out.println(name.charAt(i));
            i++;
            }
            else{
                timer.cancel();
            }
        }

    }

public static void main(String[] args) {
    new TimerTest(2, "Bengt");

}



}

3 个答案:

答案 0 :(得分:1)

让你的类获取1个附加参数,这是计时器任务的回调。如:

public TimerTest(int seconds, String name, Consumer<String> callback)

然后调用该回调并将其传递给您通常想要返回的值。

    public void run() {
        int length = name.length();
        if(i < length){
            callback.accept(String.valueOf(name.charAt(i));
            i++;
        } else {
            timer.cancel();
        }
    }

如果您使用Java 8,则java.util.function.Consumer类将存在。如果您不使用java 8,那么您可以添加自己的界面,如:

public interface Consumer<T> { 
    void accept(T t);
}

将这些放在一起你会得到类似的结果:(使用java 8)

package GU4;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
    Timer timer;
    private String name;
    private int i = 0;
    private Consumer<String> callback;
    public TimerTest(int seconds, String name, Consumer<String> callback) {
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000, 1000);
        this.name = name;
        this.callback = callback;
    }
    class RemindTask extends TimerTask{

        public void run() {
            int length = name.length();
            if(i < length){
                callback.accept(String.valueOf(name.charAt(i)));
                i++;
            } else {
                timer.cancel();
            }
        }

    }

    public static void main(String[] args) {
        new TimerTest(2, "Bengt", (c)-> {
            System.out.println("New Val: " + c);
        });
    }

}

答案 1 :(得分:0)

您可以在run()类的单独方法中包含RemindTask方法所做的所有操作,该方法将返回您选择的任何类型的数据,然后从run()内部调用它方法

答案 2 :(得分:0)

另一种方法可能是使用DelayQueue并在适当的超时后让角色掉落。