【问题标题】:Java full screen background color wont change?Java全屏背景颜色不会改变?
【发布时间】:2015-03-22 17:29:01
【问题描述】:

我有一些代码可以在 java 中创建一个全屏图标并将背景颜色设置为粉红色,将前景色设置为红色。但是,每次我运行它时,它都不会将背景颜色更改为红色,而只是让它透明。我把代码放在下面。

主java:

import java.awt.*;

import javax.swing.*;

@SuppressWarnings({ "serial" })
public class bob extends JFrame{
    public static void main(String[] args) {

    DisplayMode dm = new DisplayMode(800,600,16, DisplayMode.REFRESH_RATE_UNKNOWN);
    bob b = new bob();
    b.run(dm);
}

public void run(DisplayMode dm){
    setBackground(Color.PINK);
    setForeground(Color.RED);
    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();
    }
}

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

}

这里是屏幕类:

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

public class screen2 {

private GraphicsDevice vc;

public screen2(){

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

}

有人有什么想法吗?

【问题讨论】:

  • 尝试拨打setOpaque(true)
  • 如果图标应该是屏幕大小,那么背景应该画在哪里?

标签: java swing jframe paint thread-sleep


【解决方案1】:
public void paint(Graphics g){
    g.drawString("This is gonna be awesome", 200, 200);
}

背景的绘制是在paint() 方法中完成的。您覆盖了该方法并且没有调用 super.paint(g) 所以背景永远不会被绘制。

但是,这不是进行自定义绘画的方法。您不应该覆盖 JFrame 的 paint() 方法。如果您想进行自定义绘画,请覆盖 JPanelpaintComponent() 方法,然后将面板添加到框架中。

阅读 Custom Painting 上的 Swing 教程部分了解更多信息。

编辑:

添加 super.paint(g) 后,框架的子组件将被绘制。这意味着内容窗格被绘制并且内容窗格被绘制在框架上,因此您不会看到框架的背景,因此您还需要添加:

//setBackground(Color.PINK);
getContentPane().setBackground(Color.PINK);

【讨论】:

  • 我已经在看一个教程,它对他有用。这只是给了我一个空白屏幕!
  • @AndrewNeate, and it worked for him - 我怀疑我已经给你的确切原因。虽然,我最初的答案是不完整的。见编辑。此外,类名应以大写字符开头。在论坛中发布代码时遵循 Java 约定。
【解决方案2】:

背景的绘制是在paint函数中完成的。因此,您必须在绘制函数开始时调用 super.paint(g)
此外,您需要覆盖 setBackground 函数。
所以代码变成:

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

public void setBackground(Color color){
    super.setBackground(color);
    getContentPane().setBackground(color);
}

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 2014-06-21
    • 2014-04-21
    • 2021-01-23
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多