如何在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)
,以便您可以看到背景。)
背景面板条目根据您的要求显示了几种不同的方法。
您可以创build组件的子类
http://www.jguru.com/faq/view.jsp?EID=9691
或者用包装来摆弄
http://www.java-tips.org/java-se-tips/javax.swing/wrap-a-swing-jcomponent-in-a-background-image.html
这是另一个快速的方法,不使用额外的面板。
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的底部或任何内容窗格