2012-06-29 148 views
4

我有兩個類文件:爲什麼我的背景顏色不會顯示在JFrame中?

屏幕https://gist.github.com/3020101

JMain https://gist.github.com/3020107

我試圖讓它去全屏5秒,顯示背景(或者,在這一點上,連前景),但是當我運行它時,它會全屏顯示5秒鐘,但這只是一個空白的淺灰色屏幕。

我在做什麼錯?最終,我將使用背景圖片,並且要確保我不會在某個地方搞砸。

謝謝你們!

編輯:當我在我的JMain類的最後添加這個時,字體顏色與前景顏色相同,但無論我在程序中改變它的顏色,背景總是黑色。

public void paint(Graphics g) { 
    g.drawString("This is gonna be awesome", 200, 200); 
} 

從GitHub代碼

import java.awt.*; 
import javax.swing.JFrame; 

public class JMain extends JFrame { 

    private JFrame frame = new JFrame(); 

    public static void main(String[] args) { 
     DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); 
     JMain m = new JMain(); 
     m.run(dm); 
    } 

    public void run(DisplayMode dm) { 
     this.getContentPane().setBackground(Color.RED); 
     frame.setForeground(Color.BLACK); 
     frame.setFont(new Font("Arial", Font.PLAIN, 24)); 
     Screen s = new Screen(); 
     try { 
      s.setFullScreen(dm, this); 
      try { 
       Thread.sleep(5000); 
      } catch (Exception ex) { 
      } 
     } finally { 
      s.restoreScreen(); 
     } 
    } 
} 

import java.awt.*; 
import javax.swing.JFrame; 

public class Screen { 

    private GraphicsDevice vc; 

    public Screen() { 
     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     vc = env.getDefaultScreenDevice(); 
    } 

    public void setFullScreen(DisplayMode dm, JFrame window) { 
     window.setUndecorated(true); 
     window.setResizable(false); 
     vc.setFullScreenWindow(window); 
     if (dm != null && vc.isDisplayChangeSupported()) { 
      try { 
       vc.setDisplayMode(dm); 
      } catch (Exception ex) { 
      } 
     } 
    } 

    public Window getFullScreenWindow() { 
     return vc.getFullScreenWindow(); 
    } 

    public void restoreScreen() { 
     Window w = vc.getFullScreenWindow(); 
     if (w != null) { 
      w.dispose(); 
     } 
     vc.setFullScreenWindow(null); 
    } 
} 

回答

5

替換:

setBackground(Color.RED); 

隨着:

getContentPane().setBackground(Color.RED); 

另外,您應該嘗試將圖形相關的代碼放在SwingUtilities.invoke中,因爲如果從主線程使用圖形相關的類,您可能會遇到意外的問題。如果您進行此更改,請確保避免在SwingUtilities.invoke中進行睡眠......因爲它會阻止您的繪畫。

10
  1. 請不要擴展JFrame,而應創建一個本地JFrame變量並使用它。

  2. 您不能繪製JFrame的背景顏色,但是您可以爲JFrame的contentPane(通常爲JPanel)執行此操作。一個代碼示例如下:

    this.getContentPane()。setBackground(Color.RED);

  3. 永遠不要在Swing事件線程調用的代碼中使用Thread.sleep(int),因爲這將完全阻塞此線程,阻止它執行必要的操作來繪製GUI並與用戶交互,並有效凍結應用程序,只要線程正在睡覺。

  4. 使用Swing Timer代替Thread.sleep(...)

+1

+1。他應該避免使用'paint()'來繪製 – GETah

+0

<3你是個學者和紳士!謝謝,這個作品。 –

相關問題