Java 计时器类的返回值

Java 计时器类的返回值,java,swing,timer,Java,Swing,Timer,我正在处理一个计时器类,我想用它在设定的秒数后从单词中一次返回一个字符。基本上,我希望在JPanel中显示另一个类中的字符,并在大约一秒钟后更改显示的字母。我可以让它在同一个类中写出System.out.println中的字符,但是如果我只想按时间间隔一次返回一个字符,我不确定如何将它用于另一个类。我无法从run方法返回任何内容,因为它是无效的,因此我将非常感谢您对我如何解决此问题的任何帮助 package GU4; import java.util.Timer; import java.uti

我正在处理一个计时器类,我想用它在设定的秒数后从单词中一次返回一个字符。基本上,我希望在JPanel中显示另一个类中的字符,并在大约一秒钟后更改显示的字母。我可以让它在同一个类中写出System.out.println中的字符,但是如果我只想按时间间隔一次返回一个字符,我不确定如何将它用于另一个类。我无法从run方法返回任何内容,因为它是无效的,因此我将非常感谢您对我如何解决此问题的任何帮助

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");

}



}
GU4包;
导入java.util.Timer;
导入java.util.TimerTask;
公共类时间测试{
定时器;
私有字符串名称;
私有整数i=0;
公共计时器测试(整数秒,字符串名称){
定时器=新定时器();
timer.schedule(新的提醒任务(),秒*1000,1000);
this.name=名称;
}
类任务扩展TimerTask{
公开募捐{
int length=name.length();
如果(i
您可以在
提醒任务
类的一个单独的方法中包含
运行()
方法所做的一切,该方法将返回您选择的任何类型的数据,然后从
运行()
方法内部调用它。

使您的类接受一个额外的参数,该参数是计时器任务的回调。例如:

public TimerTest(int seconds, String name, Consumer<String> callback)
把这些放在一起,你会得到如下结果:(使用Java8)

GU4包;
导入java.util.Timer;
导入java.util.TimerTask;
公共类时间测试{
定时器;
私有字符串名称;
私有整数i=0;
私人消费者回调;
公共计时器测试(整数秒、字符串名称、使用者回调){
定时器=新定时器();
timer.schedule(新的提醒任务(),秒*1000,1000);
this.name=名称;
this.callback=回调;
}
类任务扩展TimerTask{
公开募捐{
int length=name.length();
如果(i<长度){
accept(String.valueOf(name.charAt(i));
i++;
}否则{
timer.cancel();
}
}
}
公共静态void main(字符串[]args){
新TimerTest(2,“Bengt”,(c)->{
System.out.println(“新值:+c”);
});
}
}

另一种方法可能是使用DelayQueue,并在适当的超时后将字符从末尾删除

    public void run() {
        int length = name.length();
        if(i < length){
            callback.accept(String.valueOf(name.charAt(i));
            i++;
        } else {
            timer.cancel();
        }
    }
public interface Consumer<T> { 
    void accept(T t);
}
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);
        });
    }

}