2012-10-05 33 views
0

我想有一個圖像的背景,所以我創建了一個JFrame以下代碼:setBackgrounds在Windows拋出異常(但不是在MacOSX上)

@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    try { 
     final Image image = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png")); 
     int iw = 256; 
     int ih = 256; 
     for (int x = 0; x < getWidth(); x += iw) { 
      for (int y = 0; y < getHeight(); y += ih) { 
       g.drawImage(image, x, y, iw, ih, this); 
      } 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    for(Component componente:getComponents()){ 
     componente.repaint(); 
    } 

} 

我看到的背景顏色有着某種偏好和我決定,因此設置爲不可見:

setBackground(new java.awt.Color(0,0,0,0)); 

它在Mac OS X(Java 1.6的)工作正常,我不得不探索它在Windows中,如果我刪除的setBackground叫它不顯示我的背景,如果我保持背景顏色不可見,則會引發異常並說框架已裝飾!

我試圖使用setUndecorate(true),但在macosx它丟失了標題欄(當然),並在Windows中它給了我一個透明的窗口。

我該如何解決呢?

+1

[This](http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html)可能有助於解釋爲什麼你有問題帶有alpha值的setBackground – MadProgrammer

回答

1

如果你能避免它,不會覆蓋頂層容器paint方法(如JFrame),他們做了許多重要的事情。

在這種情況下,你會使用JPanel和設置框架內容窗格它的更好...

喜歡的東西...

public class BackgroundPane extends JPanel { 

    private Image background; 
    public BackgroundPane() { 
     try { 
      background = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png")); 
     } catch (IOException ex) { 
      Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int iw = 256; 
     int ih = 256; 
     for (int x = 0; x < getWidth(); x += iw) { 
      for (int y = 0; y < getHeight(); y += ih) { 
       g.drawImage(background, x, y, iw, ih, this); 
      } 
     } 
    } 
} 

//... 

JFrame frame = new JFrame(); 
frame.setContentPane(new BackgroundPane()); 
//... 

不要做任何事情您的油漆方法的是要麼費時或可能導致重繪管理器來安排你的組件再次重​​新粉刷

之類的東西......

final Image image = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png")); 

for(Component componente:getComponents()){ 
    componente.repaint(); 
} 

裏面你paint方法是一個非常糟糕的主意。

第二個可能導致重繪管理器來決定父容器(相框)需要重新粉刷一遍又一遍又一遍又一遍......最終消耗你的CPU ...

當心,從Java 7開始,如果調用setBackground的顏色在Window上包含的alpha值小於255,將導致窗口變爲透明。

Window.setBackground(彩色)傳遞新的色彩(0,0,0,α-)到這個 方法,其中alpha是小於255,安裝每個像素半透明

這也將拋出一個異常,如果窗口裝飾...

相關問題