如何在java的Swing GUI中将图像设置为Frame的背景?

时间:2009-09-23 14:11:57

标签: java swing

我使用Swing of Java创建了一个GUI。我现在必须将一个sample.jpeg图像设置为我放置组件的框架的背景。如何做到这一点?

8 个答案:

答案 0 :(得分:21)

JPanel中没有“背景图片”的概念,因此必须用自己的方式来实现这样的功能。

实现此目的的一种方法是覆盖paintComponent方法,以便在每次刷新JPanel时绘制背景图像。

例如,可以将JPanel子类化,并添加一个字段来保存背景图像,并覆盖paintComponent方法:

public class JPanelWithBackground extends JPanel {

  private Image backgroundImage;

  // Some code to initialize the background image.
  // Here, we use the constructor to load the image. This
  // can vary depending on the use case of the panel.
  public JPanelWithBackground(String fileName) throws IOException {
    backgroundImage = ImageIO.read(new File(fileName));
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    // Draw the background image.
    g.drawImage(backgroundImage, 0, 0, this);
  }
}

(以上代码尚未经过测试。)

以下代码可用于将JPanelWithBackground添加到JFrame

JFrame f = new JFrame();
f.getContentPane().add(new JPanelWithBackground("sample.jpeg"));

在此示例中,ImageIO.read(File)方法用于读取外部JPEG文件。

答案 1 :(得分:5)

通过使用绘制图像的JPanel替换框架的内容窗格,可以轻松完成此操作:

try {
    final Image backgroundImage = javax.imageio.ImageIO.read(new File(...));
    setContentPane(new JPanel(new BorderLayout()) {
        @Override public void paintComponent(Graphics g) {
            g.drawImage(backgroundImage, 0, 0, null);
        }
    });
} catch (IOException e) {
    throw new RuntimeException(e);
}

此示例还将面板的布局设置为BorderLayout以匹配默认的内容窗格布局。

(如果您在查看图片时遇到任何问题,可能需要在其他一些组件上调用setOpaque(false),以便您可以看到背景。)

答案 2 :(得分:3)

Background Panel条目根据您的要求显示了几种不同的方式。

答案 3 :(得分:2)

答案 4 :(得分:1)

这是另一种不使用其他面板的快速方法。

JFrame f = new JFrame("stackoverflow") { 
  private Image backgroundImage = ImageIO.read(new File("background.jpg"));
  public void paint( Graphics g ) { 
    super.paint(g);
    g.drawImage(backgroundImage, 0, 0, null);
  }
};

答案 5 :(得分:1)

如果您使用netbeans,可以在框架中添加jlabel,并通过属性将其图标更改为图像并删除文本。然后通过导航器

将jlabel移动到Jframe的底部或任何内容窗格

答案 6 :(得分:1)

  

也许最简单的方法是添加图像,缩放图像并将其设置为JFrame / JPanel(在我的情况下为JPanel),但是请记住只有在添加其他子项之后才将其“添加”到容器中组件。 enter image description here

 public void fillPOcombo()
 {
        DynamicConnection con = new DynamicConnection();
        con.mysqlconnection();
        con.sqlquery("select PO_No from TBL_PO");
        con.dataread();

        while (con.datareader.Read())
        {
            cmbpono.Items.Add((int)con.datareader["PO_NO"]);
        }
}

答案 7 :(得分:0)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class BackgroundImageJFrame extends JFrame
{
  JButton b1;
  JLabel l1;
public BackgroundImageJFrame()
{
setTitle("Background Color for JFrame");
setSize(400,400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
/*
 One way
-----------------*/
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);

// Another way
setLayout(new BorderLayout());
setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads  \\colorful design.png")));
setLayout(new FlowLayout());
l1=new JLabel("Here is a button");
b1=new JButton("I am a button");
add(l1);
add(b1);
// Just for refresh :) Not optional!
  setSize(399,399);
   setSize(400,400);
   }
   public static void main(String args[])
  {
   new BackgroundImageJFrame();
 }
 }