将字符串转换为java.awt.Color

问题描述:

我试图将String对象转换为java.awt.Color对象。将字符串转换为java.awt.Color

我正在扫描用户的输入颜色。用户输入颜色并将颜色保存在String中。我想把这种颜色加入String的颜色ArrayList。我怎么做?

Scanner sc = new Scanner(System.in); 
System.out.println("\nEnter your color\n" + 
         "BLUE, BLACK, ORANGE, WHITE, YELLOW, RED, GREEN, PINK:"); 

String str = sc.next(); 
str = str.toUpperCase(); 

private ArrayList<Color> colorArray= new ArrayList<Color>(); 

// Here I want to put the colors (string str) in the colorArray arraylist. 

我该如何做到这一点?

+2

感谢所有的反对票。但也许一个解释也是一个不错的姿态。 –

+1

您可以通过首先确定所需的逻辑步骤,然后将其转换为代码来实现它。当你不知道如何做某一步时,你会研究(主要是通过搜索引擎搜索你所选择的),最后在这里找到一个问题,如果你找不到答案的话。 – Gendarme

+1

但是你使用[java.awt.Color](https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html)还是使用自定义Color类?如果是这样,然后显示它。 –

如何通过反射来做到这一点?

Color color = (Color)Color.class.getField(str).get(null); 
colorArray.add(color); 

你可能想要做一些例外情况处理用户输入一个颜色,是不是在Color类的字段。

但是,请注意,此技术仅适用于java.awt.Color类提供静态实例成员的某些基本颜色。例如。在class目前只提供了以下静态实例成员:

  • 蓝色
  • 青色
  • 深灰或DARK_GRAY
  • LIGHTGRAY或LIGHT_GRAY
  • 灰色
  • 绿色
  • 品红
  • 橙色
  • 粉色
  • 红色
  • 白色
  • 黄色

对于其他颜色,如绿松石,你必须建立使用适当的RGB组合Color对象。

下面是如何你可以用位的Java 9的做到这一点的例子:

public static void main(String[] args) throws ParseException, ClassNotFoundException { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("\nEnter your color\n" + 
      "BLUE, BLACK, ORANGE, WHITE, YELLOW, RED, GREEN, PINK:"); 

    List<Color> colorArray= new ArrayList<>(); 
    Map<String, Color> colorMap = Map.ofEntries(entry("BLUE", Color.BLUE), 
      entry("BLACK", Color.BLACK), 
      entry("ORANGE", Color.ORANGE)); // TODO: add more colours 
    while(sc.hasNext()) { 
     String next = sc.next(); 
     Color c = colorMap.get(next); 
     if(c == null) { 
      if("END".equals(next)) { 
       break; 
      } 
      System.err.printf("Sorry, could not find %s%n", next); 
     } 
     else { 
      colorArray.add(c); 
      System.out.printf("Added %s%n", c); 
     } 
    } 
    System.out.println(colorArray); 
} 

这是一个样品运行的输出:

Enter your color 
BLUE, BLACK, ORANGE, WHITE, YELLOW, RED, GREEN, PINK: 
> BLUE 
Added java.awt.Color[r=0,g=0,b=255] 
> BLACK 
Added java.awt.Color[r=0,g=0,b=0] 
> ORANGE 
Added java.awt.Color[r=255,g=200,b=0] 
> END 
[java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=0,g=0,b=0], java.awt.Color[r=255,g=200,b=0]] 

这里是根据另一个版本@VHS想法使用反射:

public static void main(String[] args) throws ParseException, ClassNotFoundException, IllegalAccessException { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("\nEnter your color\n" + 
      "BLUE, BLACK, ORANGE, WHITE, YELLOW, RED, GREEN, PINK:"); 
    List<Color> colorArray= new ArrayList<>(); 
    Class<Color> colorClass = Color.class; 
    while(sc.hasNext()) { 
     String next = sc.next(); 
     try { 
      Color c = colorClass.cast(colorClass.getField(next.toLowerCase()).get(null)); 
      colorArray.add(c); 
      System.out.printf("Added %s%n", c); 
     } catch (NoSuchFieldException e) { 
      if("END".equals(next)) { 
       break; 
      } 
      System.err.printf("Sorry, could not find %s%n", next); 
     } 
    } 
    System.out.println(colorArray); 
} 

理想情况下,你会结合这两个想法(使用地图和反射),所以您支持java.awt.Color中声明的颜色+未声明的颜色。

public class TestProj { 

    public static void main (String[] args)throws IOException { 
     List<Color> colorArray= new ArrayList<Color>(); 
     Scanner sc = new Scanner(System.in); 
     System.out.println("\nEnter your color\n" + 
           "BLUE, BLACK, ORANGE, WHITE, YELLOW, RED, GREEN, PINK:"); 

     while(sc.hasNext()){ 
      String str = sc.next(); 
      str = str.toUpperCase(); 
      colorArray.add(new Color(str)); 
     } 
     System.out.println("Array size: " + colorArray.size()); 
    } 

    static class Color { 
     private String color; 

     public Color(String color){ 
      setColor(color); 
     } 

     public String getColor() { 
      return color; 
     } 

     public void setColor(String color) { 
      this.color = color; 
      System.out.println(color); 
     } 



    } 

} 

我的输出是(按Ctrl-Z来终止循环): 输入你的颜色 蓝色,黑色,橙色,白色,黄色,红色,绿色,粉红色:

BLUE BLACK ORANGE

BLUE

BLACK

ORANGE

数组大小:3