Java 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();
    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是一个复合组件,它实际上是由许多其他组件组成的

enter image description here

(来自 How to Use Root Panes )

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

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

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

这是因为您覆盖了 JFramepaint,它是使用框架的 foreground 属性(而不是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);
        }
    }
}

关于Java setBackground 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913066/

相关文章:

java - 更改 Java Swing 应用程序上的标题

java - 计算机图形学 : Moving in the world

java - 使用 sun.misc.Unsafe 获取 Java 数组项的地址?

java - 支柱2 : Change default messages on tags

java - 如何添加我的文本区域

java - 如何在 JGraphX 中将组件背景设置为特定颜色?

从 IDE Netbeans 运行 Java GUI 程序

graphics - 光线追踪中正确的着色模型

api - 我应该针对哪个版本的 OpenGL/Direct3D 以获得最佳兼容性?

java - 如何添加缺少的 Android list 文件