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

我用Java的Swing创build了一个GUI。 我必须现在设置一个sample.jpeg图像作为我已经把我的组件的框架的背景。如何做到这一点?

JPanel没有“背景图像”的概念,所以人们必须自己写一些方法来实现这样的function。

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

例如,可以创build一个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); } } 

(以上代码尚未经过testing。)

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

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

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

这很容易通过用一个JPanelreplace框架的内容窗格来完成:

 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) ,以便您可以看到背景。)

背景面板条目根据您的要求显示了几种不同的方法。

这是另一个快速的方法,不使用额外的面板。

 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); } }; 
 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(); } } 

如果您使用的是NetBeans,则可以为框架添加一个jlabel,并通过属性将其图标更改为您的图像并删除文本。 然后通过导航器将jlabel移动到Jframe的底部或任何内容窗格