Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java设置背景不工作_Java_Swing_Graphics_Jframe_Setbackground - Fatal编程技术网

Java设置背景不工作

Java设置背景不工作,java,swing,graphics,jframe,setbackground,Java,Swing,Graphics,Jframe,Setbackground,我正在用Java制作一个游戏,目前背景设置不起作用,但前景设置可以起作用。以下是我的主类代码: 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();

我正在用Java制作一个游戏,目前背景设置不起作用,但前景设置可以起作用。以下是我的主类代码:

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);
}

}
下面是我的Screen类的代码:

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);
}
}

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

(来自)

因此,当您调用
setBackground
时,您只更改底层框架的背景色,而不是位于其上的
contentPane

相反,您应该使用
getContent().setBackground(…)

“但是,
setForegound
为什么起作用呢?”我在这里问你

这是因为您已经覆盖了
JFrame
paint
,它预先配置了frame的
前台
属性(而不是
内容窗格

现在,说了这么多

  • 您应该避免从顶级容器(如
    JFrame
    )进行扩展,原因如下
  • 您也不应该覆盖它们中的
    paint
    。您应该从一个组件开始,从类似
    JPanel
    的东西扩展,并覆盖它的
    paintComponent
    方法
  • 看看:

    对于重写顶级容器的
    绘制时出错的内容,并且它们不是双缓冲的,因此更新它们会导致闪烁

    例子。。。
    getContent()不起作用,getContentPane()起作用,但它仍然不改变颜色背景你去掉了
    paint
    方法了吗,你打破了绘制链合同了吗,我去掉了它,但是如何添加文本呢?创建一个
    JPanel
    ,覆盖它的
    paintComponent
    ,在那里添加自定义绘画(可能还将面板的背景色设置为所需颜色),将其添加到框架中…正如我所说,我在重写的类中有paintComponent方法,但如何将其添加到框架中;
    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);
            }
        }
    }