如何修改Java Scanner中正确输入内容的显示颜色?
Java控制台输入内容变色解决方案
核心问题分析
你当前的思路是对的——通过ANSI转义码实现控制台文本变色,但需要调整实现逻辑,避免将带颜色代码的字符串存入集合,同时确保转义码定义正确。
可行优化建议
定义正确的ANSI颜色转义码
先在代码中明确绿色和重置的转义常量(你的bien应该对应这个绿色常量):public static final String ANSI_GREEN = "\u001B[32m"; public static final String ANSI_RESET = "\u001B[0m"; public static final String ANSI_RED = "\u001B[31m"; // 错误提示用红色调整输出与存储逻辑
不要把带颜色代码的字符串存入acertadas集合(否则后续打印集合时会重复显示颜色代码),应该验证通过后直接打印带颜色的输入内容,再存储原始字符串:if(reservadas.contains(palabras)) { // 先打印绿色的正确保留字 System.out.println(ANSI_GREEN + palabras + ANSI_RESET); // 存入原始字符串,保证集合数据纯净 acertadas.add(palabras); contador++; }优化Scanner实例创建
循环内反复创建Scanner会浪费资源,把实例移到循环外初始化:Scanner scanner = new Scanner(System.in); while (repetir || contador == max) { String palabras = scanner.nextLine().toLowerCase(); // 后续逻辑... } scanner.close(); // 循环结束后关闭资源处理控制台兼容性
部分Windows默认CMD不支持ANSI转义码,可通过以下方式解决:- 改用PowerShell运行程序(原生支持ANSI)
- 添加JVM启动参数:
-Dconsole.encoding=UTF-8 - 若需兼容旧版Windows,可使用Jansi第三方库处理颜色
修改后的完整代码示例
import java.util.Scanner; import java.util.List; import java.util.ArrayList; public class ReservedWordPractice { public static final String ANSI_GREEN = "\u001B[32m"; public static final String ANSI_RED = "\u001B[31m"; public static final String ANSI_RESET = "\u001B[0m"; public static void main(String[] args) { boolean repetir = true; int contador = 0; int max = 0; List<String> acertadas = new ArrayList<>(); // 预定义Java所有保留字集合 List<String> reservadas = List.of("abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"); Scanner scanner = new Scanner(System.in); while (repetir || contador == max) { String palabras = scanner.nextLine().toLowerCase(); if (palabras.contains(".")) { System.out.println("Has acertado las siguientes palabras: " + acertadas); repetir = false; } else { if(reservadas.contains(palabras)) { System.out.println(ANSI_GREEN + palabras + ANSI_RESET); acertadas.add(palabras); contador++; } else { System.out.println(ANSI_RED + "No es correcto" + ANSI_RESET); } if (contador == 50) { System.out.println("ENHORABUENA!!!"); System.out.println("Has acertado todas las palabras reservadas"); repetir = false; } } } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Ivan Parra
相关产品推荐
相关产品推荐

