2017-10-04 3 views
-3

J'essaie de convertir un objet String en objet java.awt.Color.Convertir String en java.awt.Color

Je numérise la couleur d'entrée d'un utilisateur. L'utilisateur entre une couleur et la couleur est enregistrée dans un String. Je veux mettre cette couleur dans un ArrayList des couleurs du String. Comment je fais ça?

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. 

Comment puis-je y parvenir?

+2

Merci pour tous ces votes. Mais peut-être qu'une explication serait un beau geste aussi. –

+1

Vous y parvenez en déterminant d'abord les étapes logiques nécessaires, puis en procédant à la conversion en code. Lorsque vous ne savez pas comment faire une étape spécifique, vous effectuez des recherches (principalement en effectuant une recherche avec le moteur de recherche de votre choix), puis vous posez une question si vous ne trouvez pas la réponse. – Gendarme

+1

Mais utilisez-vous [java.awt.Color] (https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html) ou une classe de couleur personnalisée? Si oui, montrez-le. –

Répondre

3

Que diriez-vous de le faire par réflexion?

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

Vous voudrez peut-être faire une exception dans le cas où la manipulation de l'utilisateur entre dans une couleur qui n'est pas un champ dans la classe Color.

Cependant, notez que cette technique ne fonctionnera que pour certaines couleurs de base pour lesquelles la classe java.awt.Color fournit des membres d'instances statiques. Par exemple. le class fournit actuellement des membres d'instance statiques suivants uniquement:

  • noir
  • bleu
  • cyan
  • darkgray ou
  • DARK_GRAY
  • GrisClair ou LIGHT_GRAY
  • gris
  • vert
  • magenta
  • d'orange
  • rose
  • rouge
  • blanc
  • jaune

Pour d'autres couleurs comme le turquoise, vous devrez construire l'objet Color en utilisant une combinaison appropriée RVB.

2

Voici un exemple de la façon dont vous pourriez le faire avec un peu de 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); 
} 

Ceci est la sortie d'un échantillon analysé:

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]] 

Voici une autre version basée sur idées @VHS à l'aide de réflexion:

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); 
} 

Idéalement, vous combiner les deux idées (utiliser une carte et de réflexion), donc que vous supportez les couleurs déclarées + les couleurs non déclarées dans java.awt.Color.

0
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); 
     } 



    } 

} 

Ma sortie est (Ctrl-Z pour terminer la boucle): Entrez votre couleur BLEU, NOIR, ORANGE, blanc, jaune, rouge, vert, ROSE:

BLEU NOIR ORANGE

BLEU

NOIR

ORANGE

Taille du tableau: 3