簡體   English   中英

將字符串轉換為 java.awt.Color

[英]Convert String to java.awt.Color

我正在嘗試將String對象轉換為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類為其提供靜態實例成員的某些基本顏色。 例如, 該類目前僅提供以下靜態實例成員:

  • 黑色的
  • 藍色
  • 青色
  • 深灰色或 DARK_GRAY
  • 淺灰色或 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、WHITE、YELLOW、RED、GREEN、PINK:

藍黑橙

藍色

黑色的

橘子

數組大小:3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM