Java:打印/输出着色&格式化文本到Windows计算机上的控制台

时间:2015-07-05 00:55:56

标签: java windows console printf ascii

我试图打印/输出彩色&格式化文本到控制台,在运行Windows 8(64x)的计算机上。

我从CSV文件中读取数据,使用此数据初始化Product对象的属性,并将对象存储在名为productList的ArrayList中。在使用比较器对这个列表进行排序后,我试图在一个整洁的'中打印出这种排序的结果。格式化的方式(这是我下面的代码'应该做的。另外,我试图改变输出的颜色。这是我遇到麻烦的地方。

我一直试图用Janis进行着色,但是我被卡住了。我的主要问题是格式化输出通过以下方式显示:

console.printf(format, "Name", "Category", "Price");

彩色输出通过以下方式显示:

AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);

我不确定如何使用AnsiConsole和amp;的功能。控制台在同一个打印()。

我在下面提供了两段代码。第一个是我的程序中的displaySorted(),用于以表格方式格式化我的输出。第二段代码是我一直在玩的东西,试图显示格式化的彩色文本。我包括第二部分,以展示我的一些想法&提供更多信息。

我还要在尝试与Janis合作时使用一些链接:

http://grepcode.com/snapshot/repo1.maven.org/maven2/org.fusesource.jansi/jansi/1.9

http://www.doublecloud.org/2013/10/writing-colorful-console-output-in-java/

https://forum.ragezone.com/f428/using-jansi-library-server-console-948744/

这是我第一次尝试做这样的事情,而且我可能会以错误的方式处理它。

如果您有更好的方式来显示格式化&在Windows机器上着色输出,我是所有耳朵。

请包含带有建议的代码,因为这对我来说是一个新领域。谢谢。



 public static void displaySorted(List<Product> productList) {

       //  To enable/disable the ANSI capability, you would need to install/uninstall it with a static 
       //  method: AnsiConsole.systemInstall(); AnsiConsole.systemUninstall();
   
	     // AnsiConsole.systemInstall();
		 Console console = null;
		 Iterator<Product> iterator = WareHouse.productList.iterator();
		 try {
			 console = System.console();
			 
			 if(console != null) {
				 String format = "%1$4s %2$10s %3$10s%n";
			 	while (iterator.hasNext()) {
			 		Product product = (Product)iterator.next();
			 		console.printf(format, "Name", "Category", "Price");
			 		console.printf(format, "-----", "-----", "-----");
			 		console.printf(format, product.getName(), product.getCategory(), product.getPrice());	
			 	}
			 } 	
		 }
		 /*if error occurs*/
		 catch(Exception exception) {
			exception.printStackTrace(); 
		 }
		 // AnsiConsole.systemUninstall();
	 }
&#13;
&#13;
&#13;

&#13;
&#13;
package app;

import java.io.Console;

import org.fusesource.jansi.*;

public class Main {
	public static final String BLACK = "\u001B[0;30m";
    public static final String RED = "\u001B[0;31m";
    public static final String GREEN = "\u001B[0;32m";
    public static final String YELLOW = "\u001B[0;33m";
    public static final String BLUE = "\u001B[0;34m";
    public static final String MAGENTA = "\u001B[0;35m";
    public static final String CYAN = "\u001B[0;36m";
    public static final String WHITE = "\u001B[0;37m";
    public static final String ANSI_CLS = "\u001b[2J";
    public static final String ANSI_HOME = "\u001b[H";
    public static final String ANSI_BOLD = "\u001b[1m";
    public static final String ANSI_AT55 = "\u001b[10;10H";
    public static final String ANSI_REVERSEON = "\u001b[7m";
    public static final String ANSI_NORMAL = "\u001b[0m";
    public static final String ANSI_WHITEONBLUE = "\u001b[37;44m";
    

    /********************test fields********************/
    public static String name;
    public static String category;
    public static String price;
    
	public static void main(String[] args) {
		
		setName();
		setCategory();
		setPrice();
		
		display();
	}
	
	public static void display() {
		//AnsiConsole.systemInstall();
		Console console = null;
		try {
			 console = System.console();
			 
			 if(console != null) {
				 String format = "%1$4s %2$10s %3$10s%n";

			 		console.printf(format, "Name", "Category", "Price");
			 		console.printf(format, "-----", "-----", "-----");
			 		console.printf(format, getName(), getCategory(), getPrice());	
			 } 
			// AnsiConsole.systemUninstall();
		 }
		 /*if error occurs*/
		 catch(Exception exception) {
			exception.printStackTrace(); 
		 }
	 }
	
	/********************set & get********************/
	
	/**********name**********/
	public static void setName() {
		name = "Bob";
	}
	
	public static String getName() {
		return name;
	}
	
	/**********category**********/
	public static void setCategory() {
		category = "Things";
	}
	
	public static String getCategory() {
		return category;
	}
	
	/**********price**********/
	public static void setPrice() {
		price = "$5.0";
	}
	
	public static String getPrice() {
		return price;
	}
	
	/*********************asci********************/
	
	public static void makeBlue(String blueString) {
		AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);
	}
	
	public static void makeGreen(String greenString) {
		AnsiConsole.out.println(GREEN + greenString + ANSI_NORMAL);
	}
	
	public static void makeYellow(String yellowString) {
		AnsiConsole.out.println(YELLOW + yellowString + ANSI_NORMAL);
	}
	
	public static void makeMagenta(String magentaString) {
		AnsiConsole.out.println(MAGENTA + magentaString + ANSI_NORMAL);
	}
	
	public static void makeBold(String boldString) {
		AnsiConsole.out.println(ANSI_BOLD + boldString + ANSI_NORMAL);
	}
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是跳过使用控制台进行格式化,而只是使用String.format(String format, Object... args)。它具有相同的参数,但不是直接打印到控制台,而是返回格式化的字符串。然后,您可以将返回的字符串发送到AnsiConsole以对其进行着色。所以在你的第二个例子中你可以替换

    if (console != null) {
        String format = "%1$4s %2$10s %3$10s%n";

        console.printf(format, "Name", "Category", "Price");
        console.printf(format, "-----", "-----", "-----");
        console.printf(format, getName(), getCategory(), getPrice());
    }

    if (console != null) {
        String format = "%1$4s %2$10s %3$10s%n";
        String output;
        output = String.format(format, "Name", "Category", "Price");
        makeBlue(output);
        output = String.format(format, "-----", "-----", "-----");
        makeBlue(output);
        output = String.format(format, getName(), getCategory(), getPrice());
        makeBlue(output);
    }

如果您不希望有一个变量来存储格式化的输出,您可以直接将String.format的输出传递给makeBlue(或任何颜色)

    if (console != null) {
        String format = "%1$4s %2$10s %3$10s%n";
        makeBlue(String.format(format, "Name", "Category", "Price"));
        makeBlue(String.format(format, "-----", "-----", "-----"));
        makeBlue(String.format(format, getName(), getCategory(), getPrice()));
    }