涉及java中背景图像的怪异bug

时间:2014-02-06 03:04:16

标签: java swing background-image

我的问题是,当我运行我的程序时,我得到一个白色屏幕和早期版本的文本,而不是假设要显示的背景图像。我删除了与该版本相关的所有代码。

我已经四处寻求帮助,我看过的所有帖子都说写代码我是如何设置它的。我不明白显示的背景来自哪里。

以下是重温代码:

package tactics;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.JFrame;

public class Tactics2 extends JFrame{
    private Screen s;
    private BufferedImage bg;
    private BufferedImage template;
    private boolean loaded = false;

    public static void main(String[] args) throws IOException{ 

        DisplayMode dm = new DisplayMode(1024, 768, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        Tactics2 t = new Tactics2();
        t.run(dm);
    }

    //run method
    public void run(DisplayMode dm) throws IOException{
        loadpics();

        s = new Screen(); 
        try{
            s.setFullScreen(dm, this);
            try{
                Thread.sleep(5000);
            }catch(InterruptedException ex){}
        }finally{
            s.restoreScreen();
        }
    }

    public void loadpics() throws IOException{
        bg = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
        template = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
        ChaosBack cb = new ChaosBack();
        bg = cb.ChaosBack(bg, template);
        loaded = true;
        repaint();
    }

    @Override
    public void paint(Graphics g){
        if(loaded){
            g.drawImage(bg, 0, 0, null);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

你打破了油漆链

@Override
public void paint(Graphics g){
    if(loaded){
        g.drawImage(bg, 0, 0, null);
    }
}

基本上,你没有拨打super.paintGraphics是一个共享资源,也就是说,为给定绘制周期绘制的所有内容都使用相同的Graphics上下文。

绘画链的部分工作是通过清除Graphics背景来为绘画做准备。

出于多种原因,您应该避免覆盖顶级容器的paint。它不是双缓冲的,所以它可能会随着它的更新而闪烁,并且它没有考虑到框架装饰,这意味着你最终可以在框架的边框下方绘制,而不是在可视区域内。

您最好创建一个自定义组件,从JPanel扩展并覆盖它的paintComponent方法(确保调用super.paintComponent

Thread.sleep(5000);Swing应用程序中是一个非常糟糕的主意。可以实际停止您的应用程序冷却并停止更新/绘制或响应任何用户交互。

Swing不是线程安全的。这意味着必须在Event Dispatching Thread的上下文中对UI进行所有更改。

看看:

有关详细信息和想法