Swing-JFrame 淺談如何在JFrame中新增背景色及背景圖片
阿新 • • 發佈:2019-02-20
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); } }
測試效果如下圖:
歡迎大家一起討論更好更優的方法。