2016-11-23 7 views
0

色を回転させるStringを作成しようとしています。すべての文字は異なるcolorであり、線形に回転する必要があります。テキストはJLabelの中に入ります。文字列の色の間で回転

単語と色の配列(文字列)を指定して作成できるようにテキストを作成しました。

String[] colors = {"white", "blue", "red"}; 
String word = "foo"; 
String coloredText; 

String[] letters = word.split("(?!^)"); //split text into indiv. letters 

     coloredText = "<html>"; 

     for(int i = 0, j = 0; i < letters.length; i++, j++){ 

      if(j >= colors.length) 
       j=0; 

      coloredText += String.format("<font color='%s'> %s </font>", colors[j], letters[i]); 
     } 

     coloredText += "</html>"; 

これはO青とO最終の赤、白FとFOOを有する文字列になります。

もちろん、文字より色が薄い場合は、回転し続けるだけです。

今、私はtimerを使って色を回転させましたが、私はalgorithmを実行することができません。 基本的に、すべての色は次の色に置き換えてください。最後の色は最初の色に置き換えてください。

ですから、例えば:もちろん

enter image description here

これは無視され合わない色で、与えられた文字や色、任意の数のために働くことがあります。 (10色の3文字の単語は、最初の3色のみを使用します)。

私は.replace()を使用しようとしましたが、regexは少し難しいです。

+1

フィールドの最初の文字に使用した色のインデックスを保持し、文字列の色を塗るたびに減らします。 -1に達した場合は、最後のインデックスにリセットします。最初のラウンドは0なので、あなたはWBRになります。次にそれを減らします。 -1になるので、2に設定するとRWBになります。それからあなたはそれを減らし、あなたはBRWで終わります。 –

答えて

4

0とcolors.length-1の間のオフセットカウンタとして追加の整数(コードに応じてクラス変数またはインスタンス変数)を追加することができます。

int offset = 0 

あなたのタイマーが実行されるたびに、1によりオフセットをインクリメントして、オフセットがオフセット可オーバーフローするかどうかを確認します。もしそうならば、その後にオフセットを追加0

void onTimerExecutes(){ 
    offset++; 
    if (offset >= colors.length) 
     offset = 0; 
    applyColorsToText(); 
} 

にリセットごj

また
j = offset; 
for(int i = 0, i < letters.length; i++, j++) 
+1

OPが望む方法を回転させるには、オフセットを減らす必要があります –

2

あなたは0が、インデックス配列へのオフセットをリセットしない場合は、いくつかの行をスキップすることができますモジュラス演算子を使用します。

offset = 0; 
void onTimerExecutes(){ 
offset--; 
applyColorsToText(); 
} 
を:だからあなたはあなたの周りの他の方法を回転させたい場合は、代わりにあなたのオフセットを減少さ

void onTimerExecutes(){ 
offset++; 
applyColorsToText(); 
} 

とループの

  coloredText += String.format("<font color='%s'> %s </font>", colors[offset%colors.length], letters[i]); 

にする必要があるだろうModulus Operator

を参照してください。

Math.floorMod(int, int)を使用すると、

  coloredText += String.format("<font color='%s'> %s </font>", colors[Math.floorMod(offset, colors.length)], letters[i]);