我正在研究一个计时器类,我想用它在设定的秒数后一次从一个单词返回一个字符。基本上我想在 JPanel 的另一个类中显示字符,并在一秒钟左右后更改我显示的字母。我可以让它在同一个类中的 System.out.println 中写出字符,但是如果我只想一次返回一个字符,我不确定如何将它与另一个类一起使用时间间隔。我无法从运行方法中返回任何内容,因为它是无效的,因此对于如何解决此问题的任何帮助将不胜感激。
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");
}
}
Run Code Online (Sandbox Code Playgroud)
让您的班级采用 1 个附加参数,这是计时器任务的回调。如:
public TimerTest(int seconds, String name, Consumer<String> callback)
Run Code Online (Sandbox Code Playgroud)
然后调用该回调并将您通常想要返回的值传递给它。
public void run() {
int length = name.length();
if(i < length){
callback.accept(String.valueOf(name.charAt(i));
i++;
} else {
timer.cancel();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 Java 8,则java.util.function.Consumer该类将存在。如果您不使用 java 8,那么您可以添加自己的界面,例如:
public interface Consumer<T> {
void accept(T t);
}
Run Code Online (Sandbox Code Playgroud)
把这一切放在一起,你最终会得到类似的东西:(使用 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);
});
}
}
Run Code Online (Sandbox Code Playgroud)