我试图打印/输出彩色&格式化文本到控制台,在运行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;
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;
答案 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()));
}