Java:print/output 彩色和格式化文本到控制台,在 Windows 机器上
Java: print/output colorized & formatted text to console, on a Windows machine
我正在尝试 print/output 彩色和格式化的文本到控制台,在机器上 运行 Windows 8(64x).
我正在读取 CSV 文件,使用此数据初始化 Product 对象的属性,并将这些对象存储在名为 productList 的 ArrayList 中。使用比较器对这个列表进行排序后,我试图以 'neat' 格式的方式打印排序结果(这是我下面的代码 'should' 所做的。此外,我正在尝试改变输出的颜色。这是我遇到问题的地方。
我一直在尝试使用 Janis 进行着色,但我被卡住了。我的主要问题是格式化输出显示为:
console.printf(format, "Name", "Category", "Price");
虽然彩色输出通过以下方式显示:
AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);
我不确定如何在同一个 print() 中同时使用 AnsiConsole 和 Console 的功能。
我在下面包含了两段代码。第一个是我程序中的 displaySorted(),旨在以 table 方式格式化我的输出。第二段代码,是我一直在玩的东西,试图显示格式化的、彩色的文本。我将第二部分包括在内,以展示我的一些想法并提供更多信息。
我还将包括一些我在尝试与 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 = "%1s %2s %3s%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();
}
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 = "%1s %2s %3s%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 = ".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);
}
}
我认为最简单的方法是完全跳过使用控制台进行格式化,而只使用 String.format(String format, Object... args)
。它具有相同的参数,但不是直接打印到控制台,而是 returns 格式化字符串。然后,您可以将返回的字符串发送到 AnsiConsole 以对其进行着色。所以在你的第二个例子中你可以替换
if (console != null) {
String format = "%1s %2s %3s%n";
console.printf(format, "Name", "Category", "Price");
console.printf(format, "-----", "-----", "-----");
console.printf(format, getName(), getCategory(), getPrice());
}
与
if (console != null) {
String format = "%1s %2s %3s%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 = "%1s %2s %3s%n";
makeBlue(String.format(format, "Name", "Category", "Price"));
makeBlue(String.format(format, "-----", "-----", "-----"));
makeBlue(String.format(format, getName(), getCategory(), getPrice()));
}
我正在尝试 print/output 彩色和格式化的文本到控制台,在机器上 运行 Windows 8(64x).
我正在读取 CSV 文件,使用此数据初始化 Product 对象的属性,并将这些对象存储在名为 productList 的 ArrayList 中。使用比较器对这个列表进行排序后,我试图以 'neat' 格式的方式打印排序结果(这是我下面的代码 'should' 所做的。此外,我正在尝试改变输出的颜色。这是我遇到问题的地方。
我一直在尝试使用 Janis 进行着色,但我被卡住了。我的主要问题是格式化输出显示为:
console.printf(format, "Name", "Category", "Price");
虽然彩色输出通过以下方式显示:
AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);
我不确定如何在同一个 print() 中同时使用 AnsiConsole 和 Console 的功能。
我在下面包含了两段代码。第一个是我程序中的 displaySorted(),旨在以 table 方式格式化我的输出。第二段代码,是我一直在玩的东西,试图显示格式化的、彩色的文本。我将第二部分包括在内,以展示我的一些想法并提供更多信息。
我还将包括一些我在尝试与 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 = "%1s %2s %3s%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();
}
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 = "%1s %2s %3s%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 = ".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);
}
}
我认为最简单的方法是完全跳过使用控制台进行格式化,而只使用 String.format(String format, Object... args)
。它具有相同的参数,但不是直接打印到控制台,而是 returns 格式化字符串。然后,您可以将返回的字符串发送到 AnsiConsole 以对其进行着色。所以在你的第二个例子中你可以替换
if (console != null) {
String format = "%1s %2s %3s%n";
console.printf(format, "Name", "Category", "Price");
console.printf(format, "-----", "-----", "-----");
console.printf(format, getName(), getCategory(), getPrice());
}
与
if (console != null) {
String format = "%1s %2s %3s%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 = "%1s %2s %3s%n";
makeBlue(String.format(format, "Name", "Category", "Price"));
makeBlue(String.format(format, "-----", "-----", "-----"));
makeBlue(String.format(format, getName(), getCategory(), getPrice()));
}