2012-06-12 58 views
0

我正在爲學校做作業,但我遇到了一個問題:P。 我得到這個代碼:爲什麼JPanel不會改變顏色並保持這種狀態?

public void mouseEntered(MouseEvent e) { 
    MyPanel b = (MyPanel)e.getSource(); 
    System.out.println("ID: "+b.getId()+""); 
    b.setColor(Color.blue); 
} 

在MyPanel對象我:

public void setColor(Color kleur) { 
    if(this.getBackground()==Color.white) { 
     this.setBackground(kleur); 
     repaint(); 
    } 
} 

當我進入面板與我的鼠標色彩閃爍,我進入。但我希望它保持顏色,這樣我就可以在500 Jpanels的Jform中繪製軌跡(我已將它們添加到ArrayList,但此部分工作正常)

我在做什麼錯?

+0

你能提供全'MouseListener'代碼?另外,是你確定背景設置爲白色之前?你可以通過刪除你的'MyPanel#setColor()'方法中的if語句來試試。 – brimborium

+0

我相信你應該在paint()方法中重新着色JPanel。 –

+0

在paint()方法中不需要重新着色JPanel,設置JPanel的背景工作正常,沒有必要寫一個自定義的paint()方法,會見除非你絕對需要它。 –

回答

1

基於對這個問題@ ErickRobertson的評論,我想這個問題是這樣的:

MyPanel替換JPanel#paintComponents()方法。那可能嗎?如果是這樣,你可以做到以下幾點。在你MyPanel#setColor(Color)方法,您沒有設置背景,但包含字段中輸入新的背景色:

private Color backgroundColor = Color.white; 
public void setColor(Color kleur) { 
    backgroundColor = kleur; 
    repaint(); 
} 

然後,在你MyPanel#paintComponents(Graphics)

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    // draw background 
    g.setColor(backgroundColor); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    // draw your stuff here 
} 
+0

我已經在使用 – Bram

+0

@Bram你在使用什麼? 'paintComponents()'?這正是我所說的。你的問題可能是,你使用'paintComponents()'並在你的背景上畫一些東西。這就是爲什麼你需要按照我提出的方式來實現背景顏色的原因。 – brimborium

+0

我按照你說的方式解決了它我忘記了改變painComponent方法所以當我進入塊並且我使用重畫對象時只知道默認顏色 – Bram

0

確保一次只能看到一個JPanel。

將JPanels添加到其父項時,它們是否都在彼此之上?如果是這樣,那麼當你在其中一個上撥打repaint()時,它會立即重新繪製,你可以看到它是藍色的。但只要整個窗口重新繪製一次,JPanel就會按照它們添加的順序進行繪製,最後一個最終繪製在頂部。這個面板仍然有白色背景,所以這就是你所看到的。

確保一次只能看到其中一個面板,或者您有一些計劃來管理這些面板,以便只顯示其中一個面板。否則,請確保它們以網格或其他方式佈置,以避免出現在彼此之上。

+0

我把所有JPanel放在一個GridLayout中 – Bram

0

哪裏是你的MouseListener實現的,因爲你正在從MouseEvent獲得面板。使面板實現MouseListener更容易,並讓他們決定何時更改自己的顏色。

class Panel extends JPanel implements MouseListener { 

    public Panel() { 
     // Make sure the listener listens 
     addMouseListener(this); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     setColor(Color.blue); 
    } 
    // ... other mouselisteners can be ignored or implemented as needed 
} 

如果您需要通知某個mouseenter,您仍然可以保留對其他某個類的引用。只需創建一個私有成員並在構造函數中設置引用。

0
public void setColor(Color kleur) { 
    if(this.getBackground()==Color.white) { 
     this.setBackground(kleur); 
     repaint(); 
    } 
} 

不使用== repalce與equals和嘗試無效(您的代碼基本上是說只有更換背景如果背景是白色的???

相關問題