设置JFrame的背景图片由两种方式:
1.Jpanel类的paintComponent(Graphics g)重新绘制背景图片
2.利用LayeredPane为Swing控件增加了深度,允许组建在需要的时候互相重叠
由低到高的层次是:Default,Palette,Modal,PopUp,Drag
运行展示:稍后上传
API查询:
Jpanel:http://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html
Graphics :http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html
LayeredPane:http://www.apihome.cn/api/java/JLayeredPane.htmlTips:
(1)paintComponent(Graphics g)以及paint()的区别:
super.paintComponent(g)是父类JPanel里的方法,会把整个面板用背景色重画一遍,起到清屏的作用awt控件中是在paint方法进行绘制, 所以在awt控件继承时,只要简单的覆盖paint方法就可以了。
而在swing控件中,paint方法会依次调用paintcomponent, paintborder,
paintchildren三个方法,后两者一般默认即可,所以swing编程时,如果继承jcomponent或者其子类,要覆盖paintcomponent而不是paint方法(2)LayeredPane的说明
JLayeredPanel 作为Java层次面板是创建多编辑窗口与实现某些特殊显示层次效果的最好方法
当前已经内置支持JLayeredPanel的组件包括JFrame,JDialog,JDesktopPanel本身就是个JLayeredPanel对象,JLayeredPanel中可以包含多个JComponent组件对象,并且可以相互切换到编辑状态。
*值得注意的是:
由于JLayeredPanel没有layoutManager所以必须完成设置setBounds()函数对每个添加到JLayeredPanel的对象,否则会导致无法显示该组件。由于JLayeredPanel没有layoutManager所以必须完成设置setBounds()函数对每个添加到JLayeredPanel的对象,否则会导致无法显示该组件。
方法1:
import java.awt.*;
import javax.swing.*;
//方法1:通过在JFrame中添加一个JPanel,背景图片放在JPanel上来实现
public class Java_JFrame extends JFrame //默认的事BorderLayout
{
//创建一个容器
Container ct;
//创建背景面板。
BackgroundPanel bgp; //自定义的背景类
//创建一个按钮,用来证明我们的确是创建了背景图片,而不是一张图片。
JButton jb;
public static void main(String[] args)
{
new Java_JFrame();
}
public Java_JFrame()
{
//不采用任何布局方式。
ct=this.getContentPane();
this.setLayout(null);
//重新绘制背景图片
bgp=new BackgroundPanel((new ImageIcon("D:\\Fox DownLoad\\Editplus_CK_XP85\\5.png")).getImage()); //参数是一个Image对象,
bgp.setBounds(0,0,400,300);
ct.add(bgp);
//创建按钮
jb=new JButton("测试按钮");
jb.setBounds(60,30,160,30);
ct.add(jb);
this.setSize(400,300);
this.setLocation(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class BackgroundPanel extends JPanel
{
Image im;
public BackgroundPanel(Image im)
{
this.im=im;
this.setOpaque(true); //设置控件不透明,若是false,那么就是透明
}
//Draw the background again,继承自Jpanle,是Swing控件需要继承实现的方法,而不是AWT中的Paint()
public void paintComponent(Graphics g) //绘图类,详情可见博主的Java 下 java-Graphics
{
super.paintComponents(g);
g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this); //绘制指定图像中当前可用的图像。图像的左上角位于该图形上下文坐标空间的 (x, y)。图像中的透明像素不影响该处已存在的像素
}
}
方法2:
//我们用JLayeredPane,JLayeredPane 为 JFC/Swing 容器添加了深度,允许组件在需要时互相重叠。
//Integer 对象指定容器中每个组件的深度,其中编号较高的组件位于其他组件之上
//层次依次是:Default,Palette,Modal,PopUp,Drag
public class Java_JFrame extends JFrame
{
//创建一个JLayeredPane用于分层的。
JLayeredPane layeredPane;
//创建一个Panel和一个Label用于存放图片,作为背景。
JPanel jp;
JLabel jl;
ImageIcon image;
//创建一个按钮用于测试的。
JButton jb;
public static void main(String[] args)
{
new Java_JFrame();
}
public Java_JFrame()
{
layeredPane=new JLayeredPane();
image=new ImageIcon("D:\\Fox DownLoad\\Editplus_CK_XP85\\5.png");//随便找一张图就可以看到效果。
//创建背景的那些东西
jp=new JPanel();
jp.setBounds(0,0,image.getIconWidth(),image.getIconHeight());
jl=new JLabel(image);
// jl.setBounds(0,0,image.getIconWidth(),image.getIconHeight());
jp.add(jl);
//创建一个测试按钮
jb=new JButton("测试按钮");
jb.setBounds(100,100,100,100);
//将jp放到最底层。 /*层次关系可见方法2下面的注释*/
layeredPane.add(jp,JLayeredPane.DEFAULT_LAYER);
//将jb放到高一层的地方
layeredPane.add(jb,JLayeredPane.MODAL_LAYER);
this.setLayeredPane(layeredPane);
this.setSize(image.getIconWidth(),image.getIconHeight());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(image.getIconWidth(),image.getIconHeight());
this.setVisible(true);
}
}
有什么意见或者疑问可以提出来~