2016-01-21 109 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

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