9

我是 Java 新手,为了了解更多信息,我尝试制作一个时钟。它工作得很好,除了它每次一秒变化时都会在新行上打印。我该如何制作,以便我可以用新时间替换已经打印出来的文本?

public class test {
    public static void main(String[] args) {
        test.clock();
    }
    public static void clock() {
        int sec = 0;
        int min = 0;
        int h = 0;
        for(;;) {
            sec++;
            if(sec == 60) {
                min++;
                sec = 0;
            } else if(min == 60) {
                h++;
                min = 0;
            } else if(h == 24) {
                h = 0;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(h < 10) {
                System.out.print("0"+h+":");
            } else {
                System.out.print(h+":");
            }
            if(min < 10) {
                System.out.print("0"+min+":");
            } else {
                System.out.print(min+":");
            }
            if(sec < 10) {
                System.out.println("0"+sec);
            } else {
                System.out.println(sec);
            }
        }       
    }
}

这是我的代码。这是我正在尝试做的一个例子:我想把 this:00:00:00变成 this: 00:00:01(代码会这样做,但它会打印在新行上并且不会删除旧时间)。问题是我想摆脱第一个(00:00:00)并在同一行打印第二个(00:00:01)。

这在Java中可能吗?

4

2 回答 2

20

这实际上与java无关。相反,您希望您正在显示的控制台覆盖文本。

这可以通过发送回车符(Java 中的 \r)而不是换行符(Java 中的 \n)来完成(在任何语言中)。所以你从不使用 println(),如果你想这样做,只使用 print()。如果你在第一次打印之前添加一个 print("\r") 它应该做你想要的。

顺便说一句,如果您将整个时间都构建在一个字符串中然后一次全部输出,那将会更加优雅和简单:)

于 2012-08-02T12:53:25.767 回答
0

你可以System.out.print("\u001B[A");让光标向上一行。下面是它的工作原理:

\u001B是转义字符(27 ascii 码) [在转义字符之后,字母表示我们想要对光标做什么

A:光标上移,B:光标下移,C:光标右移,D:光标左移,H:左上角,M删除当前行,T:向上滚动,S:向下滚动,J:删除所有行向下到光标

警告这不适用于 cmd 或 powershell。

于 2020-11-20T06:53:57.763 回答