2013-10-19 134 views
0

这是一个全屏五秒钟然后恢复正常的程序。我想要做的是将背景颜色更改为黄色。我试过getContentPane()。setBackground(Color.YELLOW),但它仍然不起作用。为什么我的JFrame程序不能改变背景颜色?

package gamedev; 

    import java.awt.Color; 
    import java.awt.DisplayMode; 
    import java.awt.Font; 
    import java.awt.Graphics;  
    import java.io.PrintWriter; 
    import javax.swing.JFrame; 

    public class GameDev extends JFrame { 

    public static void main(String[] arg) { 

    DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); 
    GameDev b = new GameDev(); 
    b.getContentPane().setBackground(Color.yellow); 
    b.run(dm); 

} 

public void run(DisplayMode dm) { 
    setBackground(Color.YELLOW); 
    setForeground(Color.red); 
    setFont(new Font("Arial", Font.PLAIN, 25)); 

    Screen s = new Screen(); 
    try { 
     s.setFullScreen(dm, this); 
     try { 
      Thread.sleep(5000); 
     } catch (Exception ex) { 
     } 

    } finally { 
     s.restoreScreen(); 
    } 
} 

public void paint(Graphics g) { 

    g.drawString("You know you love me home boy.", 200, 200); 

} 
} 

和第二类

package gamedev; 

    import java.awt.DisplayMode; 
    import java.awt.GraphicsDevice; 
    import java.awt.GraphicsEnvironment; 
    import java.awt.Window; 
    import javax.swing.JFrame; 

    public class Screen { 

    GraphicsDevice videoCard; 

    public Screen() { 

     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     videoCard = env.getDefaultScreenDevice(); // acces computer screen 

    } 

    public void setFullScreen(DisplayMode dm, JFrame window) { 
    window.setUndecorated(true); 
    window.setResizable(false); 
    videoCard.setFullScreenWindow(window); 

    if (dm != null && videoCard.isDisplayChangeSupported()) { 

     try { 

      videoCard.setDisplayMode(dm); 

     } catch (Exception ex) { 

     } 
     } 
    } 

    public Window getFullScreenWindow() { 

    return videoCard.getFullScreenWindow(); //returns ur window 

    } 

public void restoreScreen() { 

    Window w = videoCard.getFullScreenWindow(); 

    if (w != null) { 

     w.dispose(); 
    } 
    videoCard.setFullScreenWindow(null); // takes away from full screen. 
    } 
} 
+3

你”重新封锁一个Event Dispatching Thread,防止颜色变化。使用类似于javax.swing的定时器,Timer在后台等待指定的时间 – MadProgrammer

+0

使用应该只用... super.paint(g)内部的绘制方法。 –

回答

1

基本上,你是阻塞事件调度线程,处理任何新传入的事件,包括油漆请求阻止。相反,您应该使用类似于javax.swing.Timer的东西在后台等待,直到所需的时间过去,然后恢复屏幕。

javax.swing.Timer将在事件分派线程的上下文中的指定延迟之后提供通知,使您在需要对UI进行修改时使用它是安全的。

再仔细看看Concurrency in Swing了解更多详情...

import java.awt.Color; 
import java.awt.DisplayMode; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class GameDev extends JFrame { 

    public static void main(String[] arg) { 

     DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); 
     GameDev b = new GameDev(); 
     b.getContentPane().setBackground(Color.yellow); 
     b.run(dm); 

    } 

    public void run(DisplayMode dm) { 
     setBackground(Color.YELLOW); 
     setForeground(Color.red); 
     setFont(new Font("Arial", Font.PLAIN, 25)); 

     final Screen s = new Screen(); 
     s.setFullScreen(dm, this); 

     Timer timer = new Timer(5000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       s.restoreScreen(); 
      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawString("You know you love me home boy.", 200, 200); 

    } 

    public class Screen { 

     GraphicsDevice videoCard; 

     public Screen() { 

      GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      videoCard = env.getDefaultScreenDevice(); // acces computer screen 

     } 

     public void setFullScreen(DisplayMode dm, JFrame window) { 
      window.setUndecorated(true); 
      window.setResizable(false); 
      videoCard.setFullScreenWindow(window); 

      if (dm != null && videoCard.isDisplayChangeSupported()) { 

       try { 

        videoCard.setDisplayMode(dm); 

       } catch (Exception ex) { 

       } 
      } 
     } 

     public Window getFullScreenWindow() { 

      return videoCard.getFullScreenWindow(); //returns ur window 

     } 

     public void restoreScreen() { 

      Window w = videoCard.getFullScreenWindow(); 

      if (w != null) { 

       w.dispose(); 
      } 
      videoCard.setFullScreenWindow(null); // takes away from full screen. 
     } 

    } 

} 

你也应该看看Performing Custom Painting,为您的绘制方法,可以防止它实际上画的背景