2016-01-21 159 views
2

我正在Java中制作游戏,目前设置的背景不起作用,但setforeground正常。这里是我的主类代码:Java setBackground无法正常工作

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

public class Sam extends JFrame{ 

public static void main(String[] args) { 

    DisplayMode dm = new DisplayMode(1920, 1080, 32, 60); 
    Sam s = new Sam(); 
    s.run(dm); 
} 
public void run(DisplayMode dm){ 
    this.setBackground(Color.PINK); 
    this.setForeground(Color.BLACK); 
    setFont(new Font("Arial", Font.PLAIN, 24)); 

    Screen s = new Screen(); 
    try{ 
     s.setFullScreen(dm, this); 
     try{ 
      Thread.sleep(5000); 
     }catch(Exception ex){ex.printStackTrace();} 
    }finally{ 
     s.restoreScreen(); 
    } 
} 
public void paint(Graphics g){ 
    g.drawString("THIS IS GUNNA BE AWESOME", 200, 200); 
} 

} 

这里是我的屏幕类的代码:

import java.awt.*; 
import javax.swing.*; 
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){ex.printStackTrace();} 
    } 
} 
public Window getFullScreenWindow(){ 
    return vc.getFullScreenWindow(); 
} 
public void restoreScreen(){ 
    Window w = vc.getFullScreenWindow(); 
    if(w != null){ 
     w.dispose(); 
    } 
    vc.setFullScreenWindow(null); 
} 
} 

回答

1

JFrame是复合成分,它实际上是由许多其他组件

enter image description here

(来自How to Use Root Panes

因此,当您拨打setBackground时,您只会更改底层框架的背景颜色,而不是位于其上的contentPane。您可以使用getContent().setBackground(...)

“但为什么setForegound工作”我在这里问你?

那是因为你已经覆盖的JFramepaint,这是预先配置的框架​​财产(而不是contentPane

现在,说了这么多......

  1. 您应该避免从顶级容器如JFrame延伸,因为这些类型的原因和...
  2. 您不应该覆盖它们的paint。你应该从一个组件开始,从JPanel之类的东西延伸,并覆盖它的paintComponent方法。

看一看:

的事,去错了,当你覆盖顶部列夫paint埃尔容器,而且,他们不是双缓冲,因此更新它们会导致闪烁

例...

import java.awt.Color; 
import java.awt.DisplayMode; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.FontMetrics; 
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.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Sam extends JFrame { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       DisplayMode dm = new DisplayMode(1920, 1080, 32, 60); 
       Sam s = new Sam(); 
       s.run(dm); 
      } 
     }); 
    } 

    public Sam() { 
     add(new MainView()); 
    } 

    public void run(DisplayMode dm) { 

     Screen s = new Screen(); 
     s.setFullScreen(dm, this); 
     Timer timer = new Timer(5000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       s.restoreScreen(); 
      } 
     }); 
     timer.start(); 
    } 

    public class MainView extends JPanel { 

     public MainView() { 
      this.setBackground(Color.PINK); 
      this.setForeground(Color.BLACK); 
      setFont(new Font("Arial", Font.PLAIN, 24)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      String text = "THIS IS GUNNA BE AWESOME"; 
      FontMetrics fm = g.getFontMetrics(); 
      int x = (getWidth() - fm.stringWidth(text))/2; 
      int y = ((getHeight() - fm.getHeight())/2) + fm.getAscent(); 
      g.drawString(text, x, y); 
     } 

    } 

    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) { 
        ex.printStackTrace(); 
       } 
      } 
     } 

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

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

的getContent()不工作,的getContentPane()的作品,但它仍然没有改变颜色的背景 –

+0

你摆脱了'涂料'的方法,你打破油漆链合同 – MadProgrammer

+0

好吧,我摆脱了它,但如何添加文本呢? –