簡體   English   中英

為什么setBackground會覆蓋其他繪圖?

[英]Why does setBackground cover other drawing?

我有以下代碼:

    private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    getContentPane().setBackground(new Color(50, 100, 200));
    Graphics g = getGraphics();
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115);  
}    

我希望它以適當的方式繪制表單(按下按鈕之后),但相反的是它在第一次單擊后僅繪制背景,在第二次單擊后繪制其他對象。 當我嘗試這種方法時,使用覆蓋繪制方法:

public void paint(Graphics g){
    setBackground(new Color(50, 100, 200));       
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115);  
}

並擁有

private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    repaint();  
}

然后背景是灰色而不是藍色,按鈕消失(只有在我將鼠標放在它上面后才會出現)。

所以,最后我的問題是:這兩個例子究竟出了什么問題(我想要理解這兩個例子,因為這只是一個學習練習,我想知道發生了什么,而不是簡單地找到解決方案),以及哪種方法更好? 在此先感謝,我希望我在這個網站上沒有錯過類似的問題,如果我對不起!

Graphics g = getGraphics();

不要使用getGraphics()來進行自定義繪畫。 這種類型的繪畫只是暫時的,並且在下次Swing重新繪制組件時將丟失。 另外,不要覆蓋paint()方法。 要設置組件的背景顏色,您只需執行以下操作:

component.setBackground(...);

通過覆蓋自定義組件的paintComponent()方法來完成自定義繪制。 不要忘記在開始時調用super.paintComponent()。 閱讀自定義繪畫的Swing教程以獲取更多信息。

覆蓋繪制的方法是正確的,您應該使用:

g.setColor(new Color(50, 100, 200));
g.fillRect(0, 0, c.getWidth(),c.getHeight());

代替:

setBackground(new Color(50, 100, 200));   

或者設置背景顏色,在paint()方法中,在繪制其他內容之前調用super實現:

super.paint(g);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM