一、方法介绍
(一)
自定义一个ImagePanel,重写paintComponent方法,然后应用窗体中设置为contentPane即可。
(1) ImagePanel.java
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImagePanel extends JPanel {
// 图片宽度
private int width;
// 图片高度
private int height;
// 图片
private BufferedImage image = null;
public ImagePanel(int width, int height, String path) {
super();
// 设置宽高
this.width = width;
this.height = height;
try {
// 读取图片
image = ImageIO.read(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image,0,0,width,height,this);
}
}
(2) TestFrame.java
import javax.swing.*;
import java.awt.*;
public class TestFrame extends JFrame {
private static final String IMAGE_PATH = "./images/background.png";
private ImagePanel imagePanel;
public TestFrame() {
// 设置窗体位置和大小
setBounds(500,300,500,500);
// 窗体关闭方式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 以下为重点代码
// 图片面板
imagePanel = new ImagePanel(500,500,IMAGE_PATH);
setContentPane(imagePanel);
// 布局方式需设置后更改
setLayout(null);
// 标签
JLabel label = new JLabel("AFAFASFASFAS");
label.setFont(new Font("微软雅黑",Font.PLAIN,40));
label.setBounds(100,100,300,30);
getContentPane().add(label);
setVisible(true);
}
public static void main(String[] args) {
new TestFrame();
}
}
效果如下:
(二)
利用标签组件JLabel包含图片,然后将标签组件JLabel添加到分层面板最底层,最后将内容面板设为透明即可。
import javax.swing.*;
import java.awt.*;
public class TestFrame extends JFrame {
private static final String IMAGE_PATH = "./images/background.png";
private ImagePanel imagePanel;
public TestFrame() {
// 设置窗体位置和大小
setBounds(500,300,500,500);
// 窗体关闭方式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 以下为重点代码
setLayout(null);
ImageIcon imageIcon = new ImageIcon(IMAGE_PATH);
JLabel image_label = new JLabel(imageIcon);
image_label.setBounds(0, 0, 500,500);
// 添加到分层面板最底层
this.getLayeredPane().add(image_label, new Integer(Integer.MIN_VALUE));
// 内容面板设为透明
((JPanel) getContentPane()).setOpaque(false);
// 标签
JLabel label = new JLabel("AFAFASFASFAS");
label.setFont(new Font("微软雅黑",Font.PLAIN,40));
label.setBounds(100,200,300,30);
getContentPane().add(label);
setVisible(true);
}
public static void main(String[] args) {
new TestFrame();
}
}
效果如下:
二、方法比较
- 第一种方法相对复杂,第二种方法相对简单。
- 第一种方法设置布局方式应在设为内容面板之后有效,第二种方法无限制。
- 第一种方法 的图片显示完整,第二种则是局部显示,相当于放大。