JAVA如何在IDEA控制台中制作进度条?
我希望在循环中使用进度条进行测试运行,但我的函数仅在循环结束时显示完整的进度条JAVA如何在IDEA控制台中制作进度条?,java,intellij-idea,Java,Intellij Idea,我希望在循环中使用进度条进行测试运行,但我的函数仅在循环结束时显示完整的进度条 static void testProgress(int all, int now) { float num = (float) (now/(all*0.1); int current = (int) (num/1); int rest = 10 - current; System.out.print("\r["); for(i
static void testProgress(int all, int now)
{
float num = (float) (now/(all*0.1);
int current = (int) (num/1);
int rest = 10 - current;
System.out.print("\r[");
for(int a=1;a<=current;a++)
{
System.out.print("|");
}
for(int b=1;b<=rest;b++)
{
System.out.print(" ");
}
System.out.print("]");
}
static void testProgress(int all,int now)
{
浮点数=(浮点)(现在/(全部*0.1);
int当前=(int)(num/1);
int rest=10-电流;
系统输出打印(“\r[”);
对于(int a=1;一个问题是,通过只调用System.out.print
方法将所有值写入一行,并反复覆盖现有的控制台输出字符串
请尝试使用类似以下内容转到下一行:
System.out.print("]");
System.out.println();//inserts new line
或更简洁的版本:
System.out.print("]\n");//\n inserts new line
要回答您的问题,对于IntelliJ console,无法简单地覆盖旧进度条并输出新的进度条。在Windows命令行(我假设是Unix系统)上,您可以按如下方式打印进度条并覆盖(使用system.out.print
,以及'\r'
)。还可以制作更具可读性的进度条(通过更改值MAX\u PIPE\u CHAR
,您可以随意加宽和缩短进度条):
public class Tester {
static void testProgress(int all, int now) {
final int MAX_PIPE_CHAR = 10;
float num = now * MAX_PIPE_CHAR * 1.01f; // 1.01f to account for any round off
int current = (int) (num / all);
int rest = MAX_PIPE_CHAR - current;
System.out.print("\r[");
for (int a = 1; a <= current; a++) {
System.out.print("|");
}
for (int b = 1; b <= rest; b++) {
System.out.print(" ");
}
System.out.print("]");
}
public static void main (String args[]){
for (int i = 0; i <= 100; i++) { // to test, taken from Aleksandar (slight modification)
testProgress(100, i);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
您得到了覆盖自身的进度条(在Windows上测试)。并且应该知道“now”是如何递增的?或者何时调用此方法?此外,您使用float num=(float)(now/(all*0.1);int current=(int)(num/1)到底想要实现什么
这是一个尖锐的逻辑错误。我在循环中使用这个函数,“现在”是循环的一步。我正在使用float num=(float)(现在/(all*0.1);int current=(int)
通过循环的亮度和当前的一步来获取进度条的当前位置。那么,为什么当前int current=(int)((float)(now*MAX\u PIPE\u CHAR))/all);
?管道字符是|
,如果您不知道的话。0.1似乎非常随意。我希望我的进度条始终是相同的。另外,(int)(num/1)
相当于(int)num
。变量num
被视为浮点,因此/1
将只将浮点除以1(与除以1.0f相同)并返回float(不进行地板分割)。请看我的回答,看看我说的int current=(int)((float)(现在是MAX_PIPE_CHAR))/all时的意思
我们的目标是重新编写这一行!使它看起来像真正的进度条,但它只显示完整的进度条……这意味着您的过程结束得非常快。我用调试器检查了您的代码-函数在每一步都打印正确的数据,但随后它就消失了overwritten@DmitryFeniksIDK如果IntelliJ控制台提供足够的控制来显示正在重新绘制进度条。命令行可能会,但事情可能会变得复杂。您可以将1.01f
设置为1.001f
。重点是在处理浮点乘法/除法时考虑舍入错误。
java Tester