将字符串转换为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.
我该如何做到这一点?
答
如何通过反射来做到这一点?
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
感谢所有的反对票。但也许一个解释也是一个不错的姿态。 –
您可以通过首先确定所需的逻辑步骤,然后将其转换为代码来实现它。当你不知道如何做某一步时,你会研究(主要是通过搜索引擎搜索你所选择的),最后在这里找到一个问题,如果你找不到答案的话。 – Gendarme
但是你使用[java.awt.Color](https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html)还是使用自定义Color类?如果是这样,然后显示它。 –