在JFrame中设置背景图片

41

有没有方法可以将图像设置为 JFrame 的背景?

4个回答

44

虽然没有内置方法,但有几种方法可以实现。我目前能想到最简单的方法是:

  1. 创建一个 JComponent 的子类。
  2. 重写 paintComponent(Graphics g) 方法以绘制所需显示的图像。
  3. 将JFrame的内容面板设置为此子类。

以下是一些示例代码:

class ImagePanel extends JComponent {
    private Image image;
    public ImagePanel(Image image) {
        this.image = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
}

// elsewhere
BufferedImage myImage = ImageIO.read(...);
JFrame myJFrame = new JFrame("Image pane");
myJFrame.setContentPane(new ImagePanel(myImage));
请注意,此代码不处理调整图像大小以适应JFrame的情况,如果这正是你想要的。

3
你应该在paintComponent方法中使用super.paintComponents()方法。 - Sajad

24

试一下这个:

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 Test {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        try {
            f.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("test.jpg")))));
        } catch (IOException e) {
            e.printStackTrace();
        }
        f.pack();
        f.setVisible(true);
    }

}

顺便说一下,这将导致内容面板不是一个容器。如果您想向其中添加内容,则必须对JPanel进行子类化并覆盖paintComponent方法。


实际上,JLabel(像所有的JComponents一样)扩展了Container。我想知道如果你向标签添加东西会发生什么? - Michael Myers
实际上什么也没有……我只是试了一下。例如,您可以添加一个JTextArea,但它不会绘制。 - Savvas Dalkitsis
什么也没有显示是因为标签具有null布局。设置标签的布局管理器,然后您可以向其添加组件。只需注意,组件的大小仍将由图像的大小确定,而不是添加到标签中的组件。 - camickr

6
您可以使用背景面板类。它会按照上述说明进行自定义绘制,但可以选择以缩放、平铺或正常大小显示图像。它还解释了如何将带有图像的JLabel用作框架的内容窗格。

2
import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

class BackgroundImageJFrame extends JFrame
{

    JButton b1;
    JLabel l1;

    public BackgroundImageJFrame() {

        setSize(400,400);
        setVisible(true);

        setLayout(new BorderLayout());

        JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful_design.png"));

        add(background);

        background.setLayout(new FlowLayout());

        l1=new JLabel("Here is a button");
        b1=new JButton("I am a button");

        background.add(l1);
        background.add(b1);
    }

    public static void main(String args[]) 
    {
        new BackgroundImageJFrame();
    }
}

请查看下面的链接

http://java-demos.blogspot.in/2012/09/setting-background-image-in-jframe.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接