【问题标题】:getContentPane().setBackground() doesn't seem to workgetContentPane().setBackground() 似乎不起作用
【发布时间】:2014-11-07 21:24:24
【问题描述】:

我试图让一个简单的窗口显示为红色背景,但它不起作用。出于某种原因,我的背景一直是灰色的,而我的代码是这样的:

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

class Courses extends JFrame {

    private Image dbImage;
    private Graphics dbg;

    Courses(){
        setTitle("Course Schedule");
        setLayout(new FlowLayout());
        getContentPane().setBackground(Color.red);
        setSize(600,600);
        setLocation(300,10);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void paint(Graphics g){
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }

    public void paintComponent(Graphics g){
        g.setColor(Color.white);
        g.fillOval(100,100,100,100);
        repaint();      
    }
}

public class canvas
{
    public static void main(String[] args){
        Courses C = new Courses();
    }
}

如您所见,我使用 Jframe 扩展了该类并使用 getContentPane().setBackground() 方法,因此这应该绘制一个带有红色背景(和一个白色椭圆)的窗口,但我得到的是灰色背景(带有白色椭圆形)。有人能看出哪里出了问题吗?

我也是第一次尝试使用缓冲绘画,我不确定现在是否顺利,但这并不重要。

【问题讨论】:

    标签: java colors background jframe


    【解决方案1】:

    在 Java 中,调用 repaint 会擦除屏幕上所有绘制的元素(Swing 组件除外)。 这意味着调用 getContentPane().setBackground(Color.RED) 仅在重新绘制框架之前可见(您立即执行此操作)。 为防止这种情况,最好调用 super.paint(g)在paint方法的开头,因为这允许JFrame在绘制之前渲染背景颜色等视觉效果。

    您也可以考虑使用setColor(Color.RED) 后跟clearRect(x, y, width, height) 来更改背景颜色。但是,这可能效率较低。

    【讨论】:

    • 谢谢,我没有意识到我尝试制作缓冲区会导致问题。
    • 问题并不是真正的缓冲区,而是由于某种原因,Java 渲染系统不会在重绘时自动渲染背景。不过,确实没有理由使用缓冲区。你的 JFrame 已经做到了!
    猜你喜欢
    • 2012-05-03
    • 2013-08-28
    • 2012-02-29
    • 2011-06-27
    • 2016-11-29
    • 2016-02-01
    • 2020-09-23
    • 2010-12-05
    • 2011-06-14
    相关资源
    最近更新 更多