2016-11-23 5 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>"; 

Это приведет к строке, которая имеет Foo с белым F, синим и красным OO окончательными.

Конечно, если бы было меньше цветов, чем писем, они бы просто продолжали вращаться.

Теперь у меня есть timer, чтобы повернуть цвет, но я не могу найти algorithm, чтобы сделать это. В принципе, каждый цвет должен заменяться следующим: последний заменяет первый.

Так, например:

enter image description here

Конечно, это должно работать для любого числа заданных букв и цветов, с цветами, которые не подходят игнорируются. (Слово из 3 букв с 10 цветами будет использовать только первые 3 цвета).

Я попытался использовать .replace(), но regex для меня слишком сложно.

Любая идея?

+1

Сохраните указатель цвета, который вы использовали для первой буквы в поле, и уменьшайте его каждый раз, когда вы окрашиваете строку. Если он достигнет -1, сбросьте его до последнего индекса. Первый раунд равен 0, поэтому вы получаете WBR. Затем вы уменьшаете его. Поскольку он становится равным -1, вы устанавливаете его в 2, и вы получаете RWB. Затем вы уменьшаете его, и вы попадаете в BRW. –

ответ

4

В качестве счетчика смещения между 0 и цветами.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, но индексировать массив с оператором модуля.См Modulus Operator

Таким образом, вы должны были бы

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

и для цикла

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

Если вы хотите, чтобы повернуть наоборот, уменьшаем ваше смещение вместо:

offset = 0; 
void onTimerExecutes(){ 
offset--; 
applyColorsToText(); 
} 

и использовать Math.floorMod(int, int), так:

  coloredText += String.format("<font color='%s'> %s </font>", colors[Math.floorMod(offset, colors.length)], letters[i]); 
Смежные вопросы