2014-12-03 79 views
0

我有問題。我的JFrame從內部的內容開始,但透明地顯示頂部的內容。JFrame背景錯誤:不需要的透明度

package javagame; 

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 

public class JavaGame extends JFrame{ 

    public JavaGame(){ 
     setTitle("Java Game"); 
     setSize(500, 500); 
     setResizable(false); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void paint (Graphics g){ 
     g.drawString("Hello World!", 250, 250); 
    } 

    public static void main(String[] args){ 

     new JavaGame(); 

    } 

} 

幫助表示讚賞! (:

回答

2

兩件事情......

首先...

您正在打破paint鏈...

public void paint (Graphics g){ 
    // You MUST call super.paint here... 
    g.drawString("Hello World!", 250, 250); 
} 

你應該避免,在所有成本,重寫paint頂級容器,如JFrame。很多原因,其中之一,你剛剛發現,但也因爲頂級容器一個沒有雙倍緩衝,這會在畫出來時引入閃爍,並且JFrame包含一堆其他組件,JRootPane,內容窗格,玻璃窗格......所有這些都可以繪製您正在嘗試繪製的內容。

而且,直接繪畫到框架可以讓你下架的裝飾,這是不是真的,你想做什麼畫...

例如(爲什麼它是壞的)...

該解決方案...

創建一個自定義的類,從JPanel延伸並覆蓋它的paintComponent方法並在那裏執行您的自定義繪畫。您可以免費獲得雙緩衝支持,不必再擔心框架的邊框,因爲內容窗格將確保它在框架裝飾中保持不變。

更多細節

請參見Painting in AWT and SwingPerforming Custom Painting,設置框的大小之前調用setResizable,這改變了框架裝飾的大小,並且可以在框架內容區域內產生意想不到的額外空間...