你如何使用图像作为背景并将图像放在前面?

时间:2014-10-24 09:47:55

标签: java image swing

我尝试了许多方法,但都没有成功。他们要么没有显示图像,要么他们让背景图像消失......你有什么建议吗?这是我的代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame{

int x, y;
Image Dak;
Image Levels;
private Image dbImage;
private Graphics dbg;

public Main(){

 setTitle("Help de Pieten");
 setSize(2000, 720);
 setResizable(true);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              try {
 this.setContentPane(
 new JLabel(new ImageIcon(ImageIO.read(new  File("Image1.gif")))));
} catch (IOException e) {}

validate(); 

ImageIcon i = new ImageIcon("Image2.gif");
    Levels = i.getImage();


    x = 100;
    y = 100;
}    

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.drawImage(Levels, x, y, this);
   repaint();
}

public static void main(String[] args) {
    Main main = new Main();

}

}

那么如何在不使背景消失的情况下在背景前拍摄图像?

1 个答案:

答案 0 :(得分:2)

首先,请避免覆盖paint等顶级容器的JFrame方法,它们不会被双重缓冲,并且它们具有复杂的组件层次结构,您不必使用它们想参与其中

相反,首先从JPanel扩展,Swing组件默认是双缓冲的,所以你不必担心自己实现它,并覆盖它{{1方法并在其中执行自定义绘画。

有关详细信息,请查看Performing Custom PaintingPainting in AWT and Swing

Swing中的Paint遵循"画家画布"范例,也就是说,无论先画的是什么,都会被下面绘的任何东西覆盖,所以为此,请确保先绘制背景,然后按每个图层绘制,以便显示它们。

Example

paintComponent