Wie drucke ich Farbe in der Konsole mit System.out.println?
323
Wie kann ich Farbe in der Konsole drucken? Ich möchte Daten in Farben anzeigen, wenn der Prozessor Daten sendet, und in verschiedenen Farben, wenn er Daten empfängt.
Wenn die Konsole (z. B. Eclipse Java-Konsole) das Anpassen der Farbe von stdout / stderr unterstützt, können Sie System.out.println für eine Farbe und System.err.println für eine andere Farbe verwenden.
jw_
Antworten:
583
Wenn Ihr Terminal dies unterstützt, können Sie ANSI-Escape-Codes verwenden , um Farbe in Ihrer Ausgabe zu verwenden. Es funktioniert im Allgemeinen für Unix-Shell-Eingabeaufforderungen. Es funktioniert jedoch nicht für die Windows-Eingabeaufforderung (obwohl es für Cygwin funktioniert). Sie können beispielsweise Konstanten wie diese für die Farben definieren:
Mit den obigen Konstanten können Sie beispielsweise den folgenden roten Text auf unterstützten Terminals ausgeben:
System.out.println(ANSI_RED +"This text is red!"+ ANSI_RESET);
Update: Möglicherweise möchten Sie die Jansi- Bibliothek überprüfen . Es bietet eine API und unterstützt Windows mithilfe von JNI. Ich habe es noch nicht ausprobiert. es sieht jedoch vielversprechend aus.
Update 2: Wenn Sie die Hintergrundfarbe des Textes in eine andere Farbe ändern möchten, können Sie auch Folgendes versuchen:
System.out.println(ANSI_GREEN_BACKGROUND +"This text has a green background but default text!"+ ANSI_RESET);System.out.println(ANSI_RED +"This text has red text but a default background!"+ ANSI_RESET);System.out.println(ANSI_GREEN_BACKGROUND + ANSI_RED +"This text has a green background and red text!"+ ANSI_RESET);
@ WhiteFang34 Kannst du bitte erklären, was RESET nützt, wenn seine Farbe SCHWARZ ist, zumindest in meiner Konsole? Ist es wie ein Standard oder etw.?
Boro
8
@Boro: Der Rücksetzcode deaktiviert alle bisher festgelegten ANSI-Attribute, wodurch die Konsole auf ihre Standardeinstellungen zurückgesetzt werden sollte. Es ist nützlich, wenn Sie die Standardfarbe nicht kennen oder auch einige der anderen Attribute wie Hintergrundfarbe, Schriftstile usw. verwenden
WhiteFang34
2
jansi ist wirklich toll! Für diejenigen, die sich in Eclipse entwickeln, kann ich dieses Plugin empfehlen : mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console und ein schönes Stück Code, um Farbe zu aktivieren, wenn der Code nicht ausgeführt wird in der Konsole:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, lesen Sie die Antwort noch einmal und Sie werden vielleicht Folgendes bemerken:however it doesn't work for Windows command prompt
Felix Edelmann
1
@DannyLo Vielen Dank für den Link zum Eclipse-Plugin!
Noah Broyles
71
Hier ist eine Liste der Farben in einer Java-Klasse mit public staticFeldern
Ich habe eine Bibliothek namens JCDP ( Java Coloured Debug Printer ) erstellt.
Für Linux, MacOS und Windows 10 werden die von WhiteFang erwähnten ANSI-Escape-Codes verwendet, diese werden jedoch mit Wörtern anstelle von Codes abstrahiert, was viel intuitiver ist. Es wird so einfach wie:
enumColor{//Color end string, color reset
RESET("\033[0m"),// Regular Colors. Normal color, no bold, background color etc.
BLACK("\033[0;30m"),// BLACK
RED("\033[0;31m"),// RED
GREEN("\033[0;32m"),// GREEN
YELLOW("\033[0;33m"),// YELLOW
BLUE("\033[0;34m"),// BLUE
MAGENTA("\033[0;35m"),// MAGENTA
CYAN("\033[0;36m"),// CYAN
WHITE("\033[0;37m"),// WHITE// Bold
BLACK_BOLD("\033[1;30m"),// BLACK
RED_BOLD("\033[1;31m"),// RED
GREEN_BOLD("\033[1;32m"),// GREEN
YELLOW_BOLD("\033[1;33m"),// YELLOW
BLUE_BOLD("\033[1;34m"),// BLUE
MAGENTA_BOLD("\033[1;35m"),// MAGENTA
CYAN_BOLD("\033[1;36m"),// CYAN
WHITE_BOLD("\033[1;37m"),// WHITE// Underline
BLACK_UNDERLINED("\033[4;30m"),// BLACK
RED_UNDERLINED("\033[4;31m"),// RED
GREEN_UNDERLINED("\033[4;32m"),// GREEN
YELLOW_UNDERLINED("\033[4;33m"),// YELLOW
BLUE_UNDERLINED("\033[4;34m"),// BLUE
MAGENTA_UNDERLINED("\033[4;35m"),// MAGENTA
CYAN_UNDERLINED("\033[4;36m"),// CYAN
WHITE_UNDERLINED("\033[4;37m"),// WHITE// Background
BLACK_BACKGROUND("\033[40m"),// BLACK
RED_BACKGROUND("\033[41m"),// RED
GREEN_BACKGROUND("\033[42m"),// GREEN
YELLOW_BACKGROUND("\033[43m"),// YELLOW
BLUE_BACKGROUND("\033[44m"),// BLUE
MAGENTA_BACKGROUND("\033[45m"),// MAGENTA
CYAN_BACKGROUND("\033[46m"),// CYAN
WHITE_BACKGROUND("\033[47m"),// WHITE// High Intensity
BLACK_BRIGHT("\033[0;90m"),// BLACK
RED_BRIGHT("\033[0;91m"),// RED
GREEN_BRIGHT("\033[0;92m"),// GREEN
YELLOW_BRIGHT("\033[0;93m"),// YELLOW
BLUE_BRIGHT("\033[0;94m"),// BLUE
MAGENTA_BRIGHT("\033[0;95m"),// MAGENTA
CYAN_BRIGHT("\033[0;96m"),// CYAN
WHITE_BRIGHT("\033[0;97m"),// WHITE// Bold High Intensity
BLACK_BOLD_BRIGHT("\033[1;90m"),// BLACK
RED_BOLD_BRIGHT("\033[1;91m"),// RED
GREEN_BOLD_BRIGHT("\033[1;92m"),// GREEN
YELLOW_BOLD_BRIGHT("\033[1;93m"),// YELLOW
BLUE_BOLD_BRIGHT("\033[1;94m"),// BLUE
MAGENTA_BOLD_BRIGHT("\033[1;95m"),// MAGENTA
CYAN_BOLD_BRIGHT("\033[1;96m"),// CYAN
WHITE_BOLD_BRIGHT("\033[1;97m"),// WHITE// High Intensity backgrounds
BLACK_BACKGROUND_BRIGHT("\033[0;100m"),// BLACK
RED_BACKGROUND_BRIGHT("\033[0;101m"),// RED
GREEN_BACKGROUND_BRIGHT("\033[0;102m"),// GREEN
YELLOW_BACKGROUND_BRIGHT("\033[0;103m"),// YELLOW
BLUE_BACKGROUND_BRIGHT("\033[0;104m"),// BLUE
MAGENTA_BACKGROUND_BRIGHT("\033[0;105m"),// MAGENTA
CYAN_BACKGROUND_BRIGHT("\033[0;106m"),// CYAN
WHITE_BACKGROUND_BRIGHT("\033[0;107m");// WHITEprivatefinalString code;Color(String code){this.code = code;}@OverridepublicString toString(){return code;}}
Java "behandelt die Codes nicht", das stimmt, aber Java gibt aus, was Sie ihm gesagt haben. Es ist nicht Javas Schuld, dass die Windows-Konsole ESC (chr (27)) als eine weitere Glyphe (←) behandelt.
Dies funktioniert nicht, da die Java IO-Ebene diese nicht in Farben konvertiert. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" ergibt nur "[31; 1mERROR [0m", wenn es von einem Windows cmd.com als ausführbare .jar ausgeführt wird
Simpleuser
Die Frage wurde nicht markiert windows. Ich erinnere mich, dass die Windows-Konsole niemals ANSI-kompatibel war.
jcomeau_ictx
Das Problem ist jedoch, dass Java die Codes nicht verarbeitet, unabhängig von der Unterstützung von cmd.com
simpleuser
3
siehe bearbeitete Antwort. Java macht genau das, was es gesagt hat. Das Problem ist die nicht ANSI-kompatible Konsole.
jcomeau_ictx
1
Ich habe das gleiche Problem
Sgrillon
7
Sie können dies mit ANSI-Escape-Sequenzen tun. Ich habe diese Klasse in Java für alle zusammengestellt, die eine einfache Problemumgehung dafür wünschen. Es ermöglicht mehr als nur Farbcodes.
Log.i(TAG,"This is an info message");Log.e(TAG,"This is an error message");Log.w(TAG,"This is a warning message");Log.d(TAG,"This is a debug message");
Der beste Weg, Konsolentext einzufärben, ist die Verwendung von ANSI-Escape-Codes . Zusätzlich zur Textfarbe ermöglichen ANSI-Escape-Codes Hintergrundfarben, Dekorationen und mehr.
Die Jansi- Bibliothek ist etwas fortgeschrittener (kann alle ANSI-Escape-Code-Funktionen verwenden), bietet eine API und unterstützt Windows mit JNA.
Andernfalls können Sie Ihre eigene Farbe manuell definieren, wie in anderen Antworten gezeigt.
Windows 10
Windows 10 (seit Build 10.0.10586 - November 2015) unterstützt ANSI-Escape-Codes ( MSDN-Dokumentation ), ist jedoch standardmäßig nicht aktiviert. So aktivieren Sie es:
Wenn die SetConsoleMode-API nicht verwendet wird, kann der globale Registrierungsschlüssel HKEY_CURRENT_USER\Console\VirtualTerminalLevelgeändert werden, indem ein Dword erstellt und für die ANSI-Verarbeitung auf 0 oder 1 gesetzt wird:
"VirtualTerminalLevel"=dword:00000001
Vor Windows 10
Die Windows-Konsole unterstützt keine ANSI-Farben. Es ist jedoch möglich, eine Konsole zu verwenden, die dies tut.
Das "Downvote" ist nicht meins - aber es gibt andere Antworten, die die Frage des OP stellen, und sie wurden vor einiger Zeit veröffentlicht. Wenn Sie eine Antwort veröffentlichen, lesen Sie: Wie schreibe ich eine gute Antwort? Bitte stellen Sie sicher, dass Sie entweder eine neue Lösung oder eine wesentlich bessere Erklärung hinzufügen, insbesondere wenn Sie ältere Fragen beantworten.
help-info.de
7
@iSahil dies wurde wahrscheinlich herabgestimmt, weil das einfache Schreiben in einen Standardfehler nichts explizit färbt. Viele IDEs und Konsolen interpretieren Fehlermeldungen und drucken sie in Rot oder ähnlichem, aber darauf können Sie sich nicht verlassen.
David
1
Dies war zwar nicht die direkte Antwort auf die oben gestellte Frage, aber dies war die Antwort, nach der ich gesucht habe, als ich nach "Java Print in Red Console" gesucht habe. Daher habe ich das Gefühl, dass es seinen Platz auf dieser Seite hat.
Maude
-2
Wenn Sie Kotlin verwenden (das nahtlos mit Java zusammenarbeitet), können Sie eine solche Aufzählung erstellen:
enumclassAnsiColor(private val colorNumber:Byte){
BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7);
companion object {privateconst val prefix ="\u001B"const val RESET ="$prefix[0m"private val isCompatible ="win"!in System.getProperty("os.name").toLowerCase()}
val regular get()=if(isCompatible)"$prefix[0;3${colorNumber}m"else""
val bold get()=if(isCompatible)"$prefix[1;3${colorNumber}m"else""
val underline get()=if(isCompatible)"$prefix[4;3${colorNumber}m"else""
val background get()=if(isCompatible)"$prefix[4${colorNumber}m"else""
val highIntensity get()=if(isCompatible)"$prefix[0;9${colorNumber}m"else""
val boldHighIntensity get()=if(isCompatible)"$prefix[1;9${colorNumber}m"else""
val backgroundHighIntensity get()=if(isCompatible)"$prefix[0;10${colorNumber}m"else""}
Und dann ist die Verwendung als solche: (Code unten zeigt die verschiedenen Stile für alle Farben)
val sampleText ="This is a sample text"
enumValues<AnsiColor>().forEach { ansiColor ->
println("${ansiColor.regular}$sampleText${AnsiColor.RESET}")
println("${ansiColor.bold}$sampleText${AnsiColor.RESET}")
println("${ansiColor.underline}$sampleText${AnsiColor.RESET}")
println("${ansiColor.background}$sampleText${AnsiColor.RESET}")
println("${ansiColor.highIntensity}$sampleText${AnsiColor.RESET}")
println("${ansiColor.boldHighIntensity}$sampleText${AnsiColor.RESET}")
println("${ansiColor.backgroundHighIntensity}$sampleText${AnsiColor.RESET}")}
Wenn Sie unter Windows ausgeführt werden, wo diese ANSI-Codes nicht unterstützt werden, werden durch die isCompatibleÜberprüfung Probleme vermieden, indem die Codes durch leere Zeichenfolgen ersetzt werden.
Antworten:
Wenn Ihr Terminal dies unterstützt, können Sie ANSI-Escape-Codes verwenden , um Farbe in Ihrer Ausgabe zu verwenden. Es funktioniert im Allgemeinen für Unix-Shell-Eingabeaufforderungen. Es funktioniert jedoch nicht für die Windows-Eingabeaufforderung (obwohl es für Cygwin funktioniert). Sie können beispielsweise Konstanten wie diese für die Farben definieren:
Dann können Sie diese nach Bedarf referenzieren.
Mit den obigen Konstanten können Sie beispielsweise den folgenden roten Text auf unterstützten Terminals ausgeben:
Update: Möglicherweise möchten Sie die Jansi- Bibliothek überprüfen . Es bietet eine API und unterstützt Windows mithilfe von JNI. Ich habe es noch nicht ausprobiert. es sieht jedoch vielversprechend aus.
Update 2: Wenn Sie die Hintergrundfarbe des Textes in eine andere Farbe ändern möchten, können Sie auch Folgendes versuchen:
Zum Beispiel:
quelle
if (System.console() == null) System.setProperty("jansi.passthrough", "true");
however it doesn't work for Windows command prompt
Hier ist eine Liste der Farben in einer Java-Klasse mit
public static
FeldernVerwendungszweck
Hinweis Vergessen Sie nicht, das Nachdrucken zu verwenden,
RESET
da der Effekt erhalten bleibt, wenn er nicht gelöscht wirdquelle
Ich habe eine Bibliothek namens JCDP ( Java Coloured Debug Printer ) erstellt.
Für Linux, MacOS und Windows 10 werden die von WhiteFang erwähnten ANSI-Escape-Codes verwendet, diese werden jedoch mit Wörtern anstelle von Codes abstrahiert, was viel intuitiver ist. Es wird so einfach wie:
Sie haben einige Beispiele im Github-Repository von JCDP .
quelle
Versuchen Sie die folgende Aufzählung:
Und jetzt machen wir ein kleines Beispiel:
quelle
Eine ziemlich tragbare Methode ist die Verwendung der rohen Escape-Sequenzen. Siehe http://en.wikipedia.org/wiki/ANSI_escape_code
[bearbeitet für user9999999 am 2017-02-20]
Java "behandelt die Codes nicht", das stimmt, aber Java gibt aus, was Sie ihm gesagt haben. Es ist nicht Javas Schuld, dass die Windows-Konsole ESC (chr (27)) als eine weitere Glyphe (←) behandelt.
quelle
windows
. Ich erinnere mich, dass die Windows-Konsole niemals ANSI-kompatibel war.Sie können dies mit ANSI-Escape-Sequenzen tun. Ich habe diese Klasse in Java für alle zusammengestellt, die eine einfache Problemumgehung dafür wünschen. Es ermöglicht mehr als nur Farbcodes.
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
(Portiert von: https://github.com/nathan-fiscaletti/ansi-util )
Beispiel Verwendung:
quelle
Wenn jemand nach einer schnellen Lösung sucht, kann er gerne die folgende Hilfsklasse verwenden :)
VERWENDUNGSZWECK:
Danke @ whiteFang34 für die ANSI-Codes.
quelle
Der beste Weg, Konsolentext einzufärben, ist die Verwendung von ANSI-Escape-Codes . Zusätzlich zur Textfarbe ermöglichen ANSI-Escape-Codes Hintergrundfarben, Dekorationen und mehr.
Unix
Wenn Sie springboot verwenden, gibt es eine spezielle Aufzählung für die Textfärbung : org.springframework.boot.ansi.AnsiColor
Die Jansi- Bibliothek ist etwas fortgeschrittener (kann alle ANSI-Escape-Code-Funktionen verwenden), bietet eine API und unterstützt Windows mit JNA.
Andernfalls können Sie Ihre eigene Farbe manuell definieren, wie in anderen Antworten gezeigt.
Windows 10
Windows 10 (seit Build 10.0.10586 - November 2015) unterstützt ANSI-Escape-Codes ( MSDN-Dokumentation ), ist jedoch standardmäßig nicht aktiviert. So aktivieren Sie es:
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
Flag. Jansi verwendet diese Option.HKEY_CURRENT_USER\Console\VirtualTerminalLevel
geändert werden, indem ein Dword erstellt und für die ANSI-Verarbeitung auf 0 oder 1 gesetzt wird:"VirtualTerminalLevel"=dword:00000001
Vor Windows 10
Die Windows-Konsole unterstützt keine ANSI-Farben. Es ist jedoch möglich, eine Konsole zu verwenden, die dies tut.
quelle
Verwenden der Farbfunktion zum Drucken von Text mit Farben
Code:
Verwendungszweck:
quelle
Zum Streichen:
quelle
Die beste Lösung, um Text in Java in roter Farbe zu drucken, ist:
quelle
Wenn Sie Kotlin verwenden (das nahtlos mit Java zusammenarbeitet), können Sie eine solche Aufzählung erstellen:
Und dann ist die Verwendung als solche: (Code unten zeigt die verschiedenen Stile für alle Farben)
Wenn Sie unter Windows ausgeführt werden, wo diese ANSI-Codes nicht unterstützt werden, werden durch die
isCompatible
Überprüfung Probleme vermieden, indem die Codes durch leere Zeichenfolgen ersetzt werden.quelle