2012-12-08 143 views
0

我已經創建了一個Java程序(用於練習目的),我有一個星星,顏色必須通過滾動鼠標從lightred變爲dark red ..(使用MouseWheelListener)和vica相反Everything適合其他類型的明星,但只有這一個不工作..而不是混淆你們,我會告訴你一些代碼!在Java中更改RGB顏色

這裏是紅星類

public class StarRed extends Star { 

    protected int r = 221; 
    protected Color rood = new Color(r, 0, 0); 

    public StarRed(int radius, int x, int y) { 
     super(radius, x, y); 


     this.color = rood; 

     System.out.println(r); 
    } 

} 

,你看,我已經嘗試使用R參數來改變顏色..

在我的控制器

我這樣做

@Override 
public void mouseWheelMoved(MouseWheelEvent e) { 

    for(StarRed s: rs) { 
     s.r += e.getWheelRotation(); 
    } 
    repaint(); 
} 

但顏色不變,任何人都可以告訴我我做錯了什麼?

回答

1

你需要每次移動的輪子,這樣的時間來實例化一個新的顏色:

for(StarRed s: rs) { 
    s.r += e.getWheelRotation(); 
    s.rood = new Color(r, 0, 0); 
    s.color = s.rood; 
} 

目前只更改領域r,而不是顏色roodr用於構造。

+2

不完全。它需要s.color = new Color(r,0,0) – SpiderPig

+0

Thx SpiderPig。發佈編輯。 – The111

1

顏色是不可變類,改變爲r的值不會改變protected Color rood

值所以你需要做的是在你的星類添加新的方法,其中魯德即顏色使用的值被改變基於給定的參數。

+2

即使Color是可變的,改變r的值也不會改變任何顏色。問題不是不變性,而是通過價值與傳遞參考。 –

+0

@JBNizet是的你是對的。謝謝。 –

1

假設您已經正確實現了mouseWheelMoved,問題出在您添加到值r時。

雖然魯德是:

protected Color rood = new Color(r, 0, 0); 

當你改變你所創建的顏色後的r值時,它不會改變你的Color rood的紅色部分的價值。

因此,您需要製作一個功能,添加到您的Color rood的紅色值,然後更改Color本身。

1

當通過int型(或任何其它原語類型)的方法或構造的一個變量,傳遞的變量(如果你喜歡的副本)的。您不通過參考到它的值。所以改變變量的值不會改變你用此變量創建的顏色。

您需要改變顏色對象(但這是不可能的,因爲顏色是不可變的),或者將顏色對象本身替換爲另一個顏色對象。