我只是想知道在使用批处理文件运行程序时是否有办法使用System.out.println();
或其他方法来创建一个很酷的加载栏。
这里真正的问题是如何使这个条看起来好像只在一行上打印。
我不希望它分散在多行如下:
[aaaaaccccccccccccccc] 25%
[aaaaaaaaaacccccccccc] 50%
[aaaaaaaaaaaaaaaccccc] 75%
保持干净利落的人会使事情更清洁,更友好。
非常感谢,
瑞斯蒂昂
修改
确定。我设法在这里找到了这个链接:How to animate the command line?,但答案是:
在Java中有更好的方法吗?
修改
这就是我最终的目标:
static final int PROGRESSBAR_LENGTH = 20;
public static void drawProgressBar(int numerator, int denominator) {
int percent = (int) (((double) numerator / (double) denominator) * 100);
String bar = "[";
int lines = round((PROGRESSBAR_LENGTH * numerator) / denominator);
int blanks = PROGRESSBAR_LENGTH - lines;
for (int i = 0; i < lines; i++)
bar += "|";
for (int i = 0; i < blanks; i++)
bar += " ";
bar += "] " + percent + "%";
System.out.print(bar + "\r");
}
private static int round(double dbl) {
int noDecimal = (int) dbl;
double decimal = dbl - noDecimal;
if (decimal >= 0.5)
return noDecimal + 1;
else
return noDecimal;
}
示例输出:
[||||||||||||||||....] 80%
(。's = space)
答案 0 :(得分:4)
作为打印退格字符的替代方法,您可以使用回车符:13(十进制),0xD(十六进制)或\ r(转义字符)。
有三个规定:
所以,沿着这些方向:
public static void loadMyProgram() {
while(programStillLoading) {
doSomeLoading();
double loadFraction = howCloseToDone(); // A number between 0 and 1
System.out.print("[");
int i = 0;
for( ; i < (int)(loadFraction * 20); i++)
System.out.print("=");
for( ; i < 20; i++)
System.out.print(" ");
System.out.print("] " + (int)(loadFraction * 100) + "%");
System.out.print((char)13);
//System.out.print((char)0xD); // Same as above, but in hex
//System.out.print("\r"); // Same as above, but as the symbol
}
System.out.println();
}
以上内容将打印[<bar>] <percent>%
,其中<bar>
为0..p
'=
',然后是0..(20-p)
''。它将保持一条线。
假设您对负载百分比的计算是单调增加的(换句话说,它不像Windows加载条那样,在3秒的时间内从20%变为110%到1%),你就不要我必须担心确保你的下一个输出等于或长于你以前的输出,因为这总是正确的。但是,在这种情况下,您可以在“%
”之后用两个空格来处理它。
答案 1 :(得分:0)
我使用退格方法完成了这项工作 - 似乎工作正常。
只需使用System.out.print()
代替System.out.println()
- 这样您就不会获得回车。
您需要跟踪需要打印的退格数量,但它可以正常工作。
BTW - 要在java中打印退格键,请使用:
System.out.print("\b");
答案 2 :(得分:0)
这可能是一个开始的地方。
用法:
ProgressBar pb = new PorgressBar(10,1);
pb.start();
while (loadingStuff) {
doStuff();
pb.update();
}
pb.finish();
班级:
public class ProgressBar {
private static String[] s;
private int pos, inc, size;
public PorgressBar(int size, int increment) {
this.size = size;
this.increment = increment;
s = new String[size+2];
Arrays.fill(s,"a");
s[0] = "[";
s[size+1] = "]";
}
public void update() {
System.out.println('\r');
if (pos+inc<size+2) {
Arrays.fill(s,pos,pos+inc,"c");
pos += inc;
}
for (String ch : s) {
System.out.print(ch);
}
}
public void finish() {
System.out.println();
}
}