Coverter String em Color ? [resolvido]

10 respostas
peerless

Galera…
Como faço isso?

:hunf:

tenho a seguinte string:

"java.awt.Color[r=153,g=255,b=255]"

10 Respostas

peerless

Já Tentei com casting, mas não dá :confused:

T

Isto para mim quer dizer:

Cast não faz milagres nem magia - ele é só uma reinterpretação, não uma conversão mágica. E em Java nem dá para criar um “cast” especial para sua classe - isso é possível em C++ mas não em Java.

No seu caso, você vai ter de criar um java.awt.Color passando os parâmetros para o construtor. E você vai ter de converter manualmente os pedaços numéricos da string para os valores numéricos. Ou seja, escreva um método que receba uma String, efetue as conversões numéricas, e retorne um objeto java.awt.Color.

andredeividi

Não sei se ajuda mas existe o StringBuilder tb não sei
com usa.

Não ajudei muito mas ta i

peerless

Apesar do Thingol ter ajudado de forma meio estúpida (risos), eu agradeço todos os comentários, e adianto que consegui resolver o problema (baseando-se na idéia do thingol):

Seguinte:

Temos um objeto JColorChooser com o nome de JCcor
Atribuimos a uma variável string, o valor da sua cor atual no formato RGB (getRGB), junto a um conjunto de aspas duplas para fazer a conversão Int to Str:

String cor = ""+JCcor.getColor().getRGB();

(pq string? não sei! Pode ser int também… depende de como você vai gravar no banco de dados)

E finalmente, utilizamos o método setColor para re-definir a cor do JCcor:

JCcor.setColor(Integer.parseInt(cor));

Abração galera!

peczenyj

Vc tem esta string: “java.awt.Color[r=153,g=255,b=255]”

Bom, vc tem este construtor do Color:

http://tns-www.lcs.mit.edu/manuals/java-api-old/java.awt.Color.html#Color(int,%20int,%20int)

agora tem que ‘parsear’ esta string atras do r, g e b :wink:

Uma forma muito sacana seria usando expressões regulares:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String,%20java.lang.String)

remove tudo o que não for numeros e virgula por Nada, acho que seria esta regex: “[^0-9,]”

uma vez que vc fez isso, terias algo como 153,255,255 – seria o caso de fazer um split em torno da virgula e terias um array de 3 posições, e cada uma pode ser convertida em um inteiro usando um Integer.parseInt

isso se as posições do r g e b forem fixas, caso contrario terias q usar outra extratégia mas que ainda assim seria uma analise da string :wink:

peerless

Fala parceiro, tudo bom? Felizmente ja resolvi meu problema. Mas tua i déia era convencional a minha antiga idéia, porém… era o plano “b”. Como ja resolvi como ja foi postado logo acima, fica meu agradecimento…

Mantu

O que você pode tentar fazer pra implementar a dica do Thingol é utilizar uma expressão regular pra extrair os valores numéricos do resultado do toString de um objeto Color.
Uma solução bem simples e tosca, e outra um pouco mais sofisticada seriam as seguintes:

class TEMPO{
	public static void main(String[] args) {
		Color c1 = Color.ORANGE;
		Color c2 = shabbyFromString(c1.toString());
		Color c3 = fancyFromString(c2.toString());
		System.out.println("c1: " + c1);
		System.out.println("c2: " + c2);
		System.out.println("c3: " + c3);
		System.out.println("c1.equals(c2): " + c1.equals(c2));
		System.out.println("c1.equals(c3): " + c1.equals(c3));
		System.out.println("c2.equals(c3): " + c2.equals(c3));
	}
	
	public static Color shabbyFromString(String colorString) {
		/*
		 * Algumas constantes interessantes... Utilizadas para indexar o 
		 * vetor que armazenará os valores obtidos de colorString
		 */
		final int
			/*
			 * RED começa com o valor 1 porque 0, no vetor, vai ter um String
			 * vazio. Estude mais o método split da classe String para entender
			 * isso melhor...
			 */
			RED = 1,
			GREEN = 2,
			BLUE = 3
		;
		
		/*
		 * Troca no String tudo que não for número por espaço
		 */
		colorString = colorString.replaceAll("\D", " ");
		/*
		 * Troca no String todos espaços replicados por um único espaço 
		 */
		colorString = colorString.replaceAll(" {2,}", " ");
		/*
		 * Quebra o String a cada espaço encontrado, criando assim um vetor
		 * de objetos String
		 */
		String[] colorValues = colorString.split(" ");
		/*
		 * Cria um objeto Color utilizando os valores armazenados nas posições
		 * do vetor colorValues
		 */
		Color result = new Color(
			Integer.parseInt(colorValues[RED]),
			Integer.parseInt(colorValues[GREEN]),
			Integer.parseInt(colorValues[BLUE])
		);
		/*
		 * Retorna a cor sintetizada
		 */
		return result;
	}
	
	public static Color fancyFromString(String colorString) {
		/*
		 * Cria um padrão de expressão regular - regex - para identificar apenas 
		 * strings com 1 ou mais caracteres numéricos
		 */
		Pattern padrao = Pattern.compile("\d+");
		/*
		 * Cria um casador(argh!!!) que utiliza o padrão de regex criado 
		 * anteriormente para fazer buscas em um determinado objeto 
		 * CharSequence (String é filha de CharSequence), que no nosso caso é 
		 * o String que queremos converter pra Color
		 */
		Matcher casador = padrao.matcher(colorString);
		/*
		 * Cria um vetor de inteiros com três posições, uma para cada componente
		 * de cor
		 */
		int[] rgb = new int[3];
		/*
		 * Constantes para indexar o vetor rgb
		 */
		final int
			RED = 0,
			GREEN = 1,
			BLUE = 2
		;
		
		for(int c = 0; c < rgb.length; c++) {
			/*
			 * Busca dentro de colorString algum trecho que "case" com a regex
			 * definida pelo Pattern padrao. Retorna true ou false.
			 * Chamadas subsequentes do método find, fará com que o casador 
			 * continue buscando por um novo trecho que case com a regex, só que
			 * começando do fim do trecho encontrado anteriormente. 
			 */
			if(casador.find()) {
				int
					/*
					 * O método start de Matcher retornará um inteiro indicando 
					 * a posição, dentro de colorString, do primeiro caractere do 
					 * trecho que casa com nossa regex.
					 * 
					 */
					inicioValor = casador.start(),
					/*
					 * O método end de Matcher retornará um inteiro indicando, 
					 * dentro de colorString, a posição seguinte ao último 
					 * caractere do trecho que casa com nossa regex 
					 */
					fimValor = casador.end()
				;
				/*
				 * Extraímos o valor do String, convertemos-o em inteiro e 
				 * armazenamos-o no vetor rgb
				 */
				rgb[c] = Integer.parseInt(
					colorString.substring(inicioValor, fimValor)
				);
			}
		}
		
		/*
		 * Retornamos o objeto Color representado pelo string colorString
		 */
		return new Color(rgb[RED], rgb[GREEN], rgb[BLUE]);
	}
}
Deh

Mantu, invés de substring, não seria melhor usar “casador.group();”?

Eu ia postar essa mesma solução usando regex, mas então vi que o peerless, já tinha encontrado uma =]

Até

Mantu

Verdade! bem melhor! Mas aí a regex teria que ser mudada para “(\d+)”, né? Também aquele lance de inicioValor e fimValor também iria pro saco…
Quando eu comecei a escrever o post, ninguém tinha respondido ainda… sou meio lerdo pra digitar, hehehe
A propósito: “casador” é de doer, né não? :lol:

Deh

não não, a regex poderia continuar “\d+”

Pattern p = Pattern.compile("\d+");
Matcher m = p.matcher("java.awt.Color[r=153,g=255,b=255]");
		
		
while (m.find()){
	System.out.println(m.group());
}

e já funcionaria certinho!
e casador dói mesmo huahuuu

Criado 28 de março de 2007
Ultima resposta 28 de mar. de 2007
Respostas 10
Participantes 6