2016-05-07 4 views
-1

Мне нужно получить это украшение на дереве, чтобы изменить цвет, это может быть с помощью таймера или какого-либо другого метода, но я борется, поскольку я совершенно новичок в этом. Я их установил как начальный цвет и добавил случайный генератор цвета, но не знаю, каким будет мой следующий шаг.Как сделать изменение объекта случайным цветом

int ornament = (int)(5 * this.scale); 
Oval blueornament = new Oval(this.x - (int)(10 * this.scale), this.y - (int)(10 * this.scale), 2 * ornament, 2 * ornament, Color.blue, true); 
Oval yellowornament = new Oval(this.x + (int)(10 * this.scale), this.y - (int)(20 * this.scale), 2 * ornament, 2 * ornament, Color.yellow, true); 
Oval redornament = new Oval(this.x + (int)(15 * this.scale), this.y + (int)(5 * this.scale), 2 * ornament, 2 * ornament, Color.red, true); 

this.window.add(trunk); 
this.window.add(foliage); 
this.window.add(foliage2); 
this.window.add(foliage3); 
this.window.add(blueornament); 
this.window.add(yellowornament); 
this.window.add(redornament); 

public void flashOrnaments() { 
    Random rand = new Random(); 
    float r = rand.nextFloat(); 
    float g = rand.nextFloat(); 
    float b = rand.nextFloat(); 
    Color randomColor = new Color(r, g, b); 
} 
+0

Что является базовым классом ваших 'объектов Oval'? –

+0

что не так с вашим кодом? –

+0

Добавить this.window.add (новый Oval (this.x + (int) (15 * this.scale), this.y + (int) (5 * этот.масштабирование), 2 * орнамент, 2 * орнамент, randomColor , true), в конце метода flashOrnaments –

ответ

0

Это было долгое время, так как я сделал это (3 года), но я думаю, что это должно дать вам общую суть о том, как подойти к этой проблеме.

Если вы хотите изменить цвет существующей формы, я думаю, вы можете изменить графический объект при рисовании. Я попытался найти стандартную библиотеку Java для Oval, but there isn't one, так что похоже, что вы сделали это самостоятельно.

Так что я изменил бы Oval класс выглядеть следующим образом:

public class Oval extends JPanel { 
    private Color color; 

    public Oval(Color color) { 
     this.color = color. 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(this.color); 
    } 

    public void changeColor(Color color) { 
     this.color = color; 
     repaint(); 
    } 
} 

Итак называя что-то вроде blueornament.setColor(Color.red) должно работать.

Теперь, если вы хотите анимировать цвет, который я предполагаю, это то, что вы используете, потому что вы говорите о таймере, вы можете просто программно установить цвет в «шагах», пока не достигнете нужного цвета (непроверенный, просто для того, чтобы дать общую идею):

Color oldColor = Oval.color; 
Color newColor = randomColor(); 

// Calculate the difference between the old and new color 
int rdiff = (oldColor.getRed() - newColor.getRed())/20; 
int gdiff = (oldColor.getGreen() - newColor.getGreen())/20; 
int bdiff = (oldColor.getBlue() - newColor.getBlue())/20; 

for (int i = 0; i < 20; i++) { 
    // Programmatically setup timers, because Thread.sleep() doesn't work here 
    int delay = 10 * i; 
    ActionListener taskPerformer = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      // Get the current color and step one further 
      int red = Oval.color.getRed() + rdiff; 
      int green = Oval.color.getGreen() + gdiff; 
      int blue = Oval.color.getBlue() + bdiff; 

      oval.setColor(new Color(red, green, blue)); 
     } 
    }; 
    new Timer(delay, taskPerformer).start(); 
} 

Надеюсь, это поможет вам на правильном пути!

0

Я полагаю, ваш window является java.awt.Window и ваш Oval является экземпляром java.awt.Component и вы пытаетесь изменить цвет ваших Oval объектов. Тогда для flashingOrnaments вам нужно перебрать все Oval объекты, добавленные в window и установить фон/цвет переднего плана на ваш randomColor, например:

for (Component component : this.window.getComponents()) { 
    if (component instanceof Oval) { 
     component.setBackground(randomColor); 
    } 
} 
Смежные вопросы