[英]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.