如何在Java中设置背景图像?

时间:2009-02-07 13:30:44

标签: java image background set

我正在使用BlueJ作为IDE开发一个使用Java的简单平台游戏。现在我在游戏中使用多边形和简单形状绘制玩家/敌人精灵,平台和其他物品。最终我希望用实际图像替换它们。

现在我想知道将图像(URL或本地源)设置为我的游戏窗口/画布的“背景”的最简单的解决方案是什么?

如果它不是很长或很复杂,我会很感激,因为我的编程技巧不是很好,我希望尽可能保持我的程序。请提供带有注释的示例代码,以详细说明它们的功能,如果它在自己的类中,如何调用它在其他类上使用的相关方法。

非常感谢。

5 个答案:

答案 0 :(得分:28)

答案会略有不同,具体取决于应用程序或小程序是使用AWT还是Swing

(基本上,以J开头的类,例如JAppletJFrame是Swing,AppletFrame是AWT。)

在任何一种情况下,基本步骤都是:

  1. 将图像绘制或加载到Image对象中。
  2. 在要绘制背景的Component的绘画事件中绘制背景图像。
  3. 第1步。加载图片可以使用Toolkit课程,也可以使用ImageIO课程。

    Toolkit.createImage方法可用于从Image中指定的位置加载String

    Image img = Toolkit.getDefaultToolkit().createImage("background.jpg");
    

    同样,可以使用ImageIO

    Image img = ImageIO.read(new File("background.jpg");
    

    第2步。需要覆盖应该获取背景的Component的绘制方法,并将Image绘制到组件上。

    对于AWT,要覆盖的方法是paint方法,并使用drawImage方法传递给paint方法的Graphics方法:

    public void paint(Graphics g)
    {
        // Draw the previously loaded image to Component.
        g.drawImage(img, 0, 0, null);
    
        // Draw sprites, and other things.
        // ....
    }
    

    对于Swing,要覆盖的方法是paintComponentJComponent方法,并使用AWT中的内容绘制Image

    public void paintComponent(Graphics g)
    {
        // Draw the previously loaded image to Component.
        g.drawImage(img, 0, 0, null);
    
        // Draw sprites, and other things.
        // ....
    }
    

    简单组件示例

    这是Panel,它在实例化时加载图像文件,并在其自身上绘制图像:

    class BackgroundPanel extends Panel
    {
        // The Image to store the background image in.
        Image img;
        public BackgroundPanel()
        {
            // Loads the background image and stores in img object.
            img = Toolkit.getDefaultToolkit().createImage("background.jpg");
        }
    
        public void paint(Graphics g)
        {
            // Draws the img to the BackgroundPanel.
            g.drawImage(img, 0, 0, null);
        }
    }
    

    有关绘画的更多信息:

答案 1 :(得分:1)

首先创建一个扩展WorldView类的新类。我打电话给我的新课Background。因此,在这个新类中导入您需要的所有Java包,以覆盖paintBackground方法。这应该是:

import city.soi.platform.*;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.ImageObserver;
import javax.swing.ImageIcon;
import java.awt.geom.AffineTransform;

在课程名称后面确保它显示为WorldView。像这样:

public class Background extends WorldView

然后声明类型为Game的变量游戏和类型为Image的图像变量:

private Game game;
private Image image;

然后在此类的构造函数中,确保类型为Game的游戏位于构造函数的签名中,并且在调用super时,您必须初始化WorldView ,初始化游戏并初始化图像变量,如下所示:

super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight());
this.game = game;
bg = (new ImageIcon("lol.png")).getImage();

然后,您只需覆盖paintBackground方法,方法与覆盖paint类中的Player方法时完全相同。就像这样:

public void paintBackground(Graphics2D g)
{
float x = getX();
float y = getY();
AffineTransform transform = AffineTransform.getTranslateInstance(x,y);
g.drawImage(bg, transform, game.getView());
}

现在最后你必须声明一个对你刚在Game类中创建的新类的类级引用,并在Game构造函数中初始化它,如下所示:

private Background image;

And in the Game constructor:
image = new Background(this);

最后,您所要做的就是将背景添加到框架中!这是我确信我们都缺失的事情。要做到这一点,你必须在声明变量frame之后做这样的事情:

frame.add(image);

确保在frame.pack();之前添加此代码。 还要确保使用不太大的背景图像!

现在就是这样!我注意到游戏引擎可以处理JPEG和PNG图像格式,但也可以支持其他格式。即使这有助于在游戏中包含背景图像,但它并不完美!因为一旦你进入下一个级别,你所有的平台和精灵都是不可见的,所有你能看到的就是你的背景图像以及游戏中包含的任何JLabel / Jbuttons。

答案 2 :(得分:0)

或试试这个;)

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

答案 3 :(得分:0)

<script>
function SetBack(dir) {
    document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>

答案 4 :(得分:-1)

如果你真的是Java新手,那么你唯一需要担心的是Path。 您需要将图像拖动到主项目文件中,它将显示在列表的最底部。

然后文件路径非常简单。这段代码进入了类的构造函数。

    img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg");

CS2是我的项目的名称,之前的所有内容都是通向工作区的。