【问题标题】:Why won't my background color display in JFrame? [duplicate]为什么我的背景颜色不会在 JFrame 中显示? [复制]
【发布时间】:2012-07-01 08:57:09
【问题描述】:

我有两个类文件:

屏幕https://gist.github.com/3020101

JMain https://gist.github.com/3020107

我试图让它全屏显示 5 秒并显示背景(或者,此时,甚至是前景),但是当我运行它时,它会全屏显示 5 秒,是的,但这只是一个空白浅灰色屏幕。

我做错了什么?最终我将使用一张图片作为背景,并且我想确保我没有搞砸什么地方。

谢谢大家!

编辑:当我在 JMain 类的末尾添加它时,字体颜色与前景色相同,但无论我在程序中将其更改为哪种颜色,背景始终为黑色。

public void paint(Graphics g) {
    g.drawString("This is gonna be awesome", 200, 200);
}

来自 github 的代码

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

public class JMain extends JFrame {

    private JFrame frame = new JFrame();

    public static void main(String[] args) {
        DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        JMain m = new JMain();
        m.run(dm);
    }

    public void run(DisplayMode dm) {
        this.getContentPane().setBackground(Color.RED);
        frame.setForeground(Color.BLACK);
        frame.setFont(new Font("Arial", Font.PLAIN, 24));
        Screen s = new Screen();
        try {
            s.setFullScreen(dm, this);
            try {
                Thread.sleep(5000);
            } catch (Exception ex) {
            }
        } finally {
            s.restoreScreen();
        }
    }
}

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

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

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

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

【问题讨论】:

    标签: java swing background jframe setbackground


    【解决方案1】:
    1. 不要扩展 JFrame,而是创建一个本地 JFrame 变量并使用它。

    2. 您无法绘制JFrame 的背景颜色,但可以为JFrame 的contentPane(通常为JPanel)执行此操作。执行此操作的代码示例如下:

      this.getContentPane().setBackground(Color.RED);

    3. 永远不要在调用 Swing 事件线程的代码中使用 Thread.sleep(int),因为这将完全阻塞该线程,阻止它执行绘制 GUI 和与用户交互的必要操作,并有效地冻结应用程序只要线程处于休眠状态。

    4. 使用Swing Timer 代替Thread.sleep(...)

    【讨论】:

    • +1。他也应该避免使用paint()
    【解决方案2】:

    替换:

    setBackground(Color.RED);
    

    与:

    getContentPane().setBackground(Color.RED);
    

    另外,您应该尝试将与图形相关的代码放在 SwingUtilities.invoke... 中,因为如果从主线程中使用与图形相关的类,您可能会遇到意想不到的问题。如果您进行此更改,请确保避免在 SwingUtilities.invoke... 中休眠,因为它会阻止您的绘画。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2013-09-17
      • 1970-01-01
      • 2014-04-21
      • 2021-04-22
      • 2020-01-09
      • 2020-03-15
      相关资源
      最近更新 更多