1. 程式人生 > >Swing-JFrame 淺談如何在JFrame中新增背景色及背景圖片

Swing-JFrame 淺談如何在JFrame中新增背景色及背景圖片

JFrame預設是BorderLayout

JPanel預設是FlowLayout。

1.JFrame設定背景色,注意體會註釋的那句話。

package com.tools;

import java.awt.Color;

import javax.swing.JFrame;
public class Test extends JFrame
{
	public static void main(String[] args)
	{
		new Test();
	}
	
	
	public Test()
	{
		this.setSize(400,300);
		this.setLocation(400,300);
		this.setBackground(Color.blue);
		this.getContentPane().setBackground(Color.red);
		this.getContentPane().setVisible(false);//如果改為true那麼就變成了紅色。
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
}


 2.給JFrame設定背景圖片。

方法1:通過在JFrame中新增一個JPanel,背景圖片放在JPanel上來實現。程式碼如下:

import java.awt.*;

import javax.swing.*;


public class Test extends JFrame
{
	//建立一個容器
	Container ct;
	//建立背景面板。
	BackgroundPanel bgp;
	
	//建立一個按鈕,用來證明我們的確是建立了背景圖片,而不是一張圖片。
	JButton jb;
	public static void main(String[] args)
	{
		new Test();
	}
	public Test()
	{
		//不採用任何佈局方式。
		ct=this.getContentPane();
		this.setLayout(null);
		
		//在這裡隨便找一張400*300的照片既可以看到測試結果。
		bgp=new BackgroundPanel((new ImageIcon("images\\background.jpg")).getImage());
		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);
	}
	//Draw the back ground.
	public void paintComponent(Graphics g)
	{
		super.paintComponents(g);
		g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);
		
	}
}


效果如圖:

 方法2:我們用JLayeredPane,JLayeredPane 為 JFC/Swing 容器添加了深度,允許元件在需要時互相重疊。Integer 物件指定容器中每個元件的深度,其中編號較高的元件位於其他元件之上。常用的幾個層如下圖:

具體實現程式碼如下:

/**
 * 給JFrame 新增一個背景圖案。
 */
package com.swingpractise;


import javax.swing.*;

public class JFrameBackground4 extends JFrame
{
	//建立一個JLayeredPane用於分層的。
	JLayeredPane layeredPane;
	//建立一個Panel和一個Label用於存放圖片,作為背景。
	JPanel jp;
	JLabel jl;
	ImageIcon image;
	
	//建立一個按鈕用於測試的。
	JButton jb;
	public static void main(String[] args)
	{
		new JFrameBackground4();
	}
	
	public JFrameBackground4()
	{
		layeredPane=new JLayeredPane();
		image=new ImageIcon("images\\background.jpg");//隨便找一張圖就可以看到效果。		
		//建立背景的那些東西
		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放到最底層。
		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);	
	}
}

測試效果如下圖:



 歡迎大家一起討論更好更優的方法。