java創(chuàng)建以任意圖片為背景的窗口
swing自帶的窗體是不能夠滿足我們的應(yīng)用需求的,所以需要制作任意圖片和形狀的JFrame框體,比如下圖:

并且可以設(shè)置窗體背景圖片的透明度

下面說明如何做到上圖的效果:
(1)首先你得需要一張好看的圖片,比如羊皮紙。但是這個下載的圖片是方方正正的矩形,羊皮紙的形狀在圖片的內(nèi)部,所以我們用美圖秀秀或者PS中的摳圖功能將羊皮紙摳出來,如下:

(2)將圖片保存為透明背景即可。
(3)接著寫一個myJFrame繼承JFrame,代碼如下:
import com.sun.awt.AWTUtilities;
import javax.swing.*;
import java.awt.*;
public class myJFrame extends JFrame{
private float alpha;
public myJFrame(String bgPath,float alpha){
super();
myContentPane rp = new myContentPane(bgPath);
rp.setOpaque(false);//設(shè)置內(nèi)容面板為透明
this.setContentPane(rp);
this.setUndecorated(true);
this.setSize(rp.img.getIconWidth(),rp.img.getIconHeight());
AWTUtilities.setWindowOpaque(this, false);//設(shè)置為JFrame為透明
this.alpha = alpha;
}
private class myContentPane extends JPanel{
public ImageIcon img;
public myContentPane(String bgPath) {
super();
img = new ImageIcon(Test.class.getResource(bgPath));
}
@Override
protected void paintComponent(Graphics g) {
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
Composite old = ((Graphics2D) g).getComposite();
((Graphics2D) g).setComposite(ac);
if(img!=null){
g.drawImage(img.getImage(), 0, 0, getWidth(), getHeight(), this);
}
((Graphics2D) g).setComposite(old);
super.paintComponent(g);
}
}
}
上面的程序主要代碼在于:設(shè)置JFrame為透明,JFrame去掉邊框,設(shè)置內(nèi)容面板為透明,然后將圖片畫到內(nèi)容面板上。
(4)寫一個測試類Test:
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
/**
* 設(shè)置背景圖和背景圖的透明度,0為全透明,1.0f為不透明。
*/
myJFrame f = new myJFrame("ab.png",0.7f);
f.setLayout(null);
Font font = new Font("宋體",Font.PLAIN,30);
JLabel user = new JLabel("用戶名");
user.setFont(font);
user.setBounds(100,150,100,30);
JTextField userInput = new JTextField();
userInput.setFont(font);
userInput.setBounds(200,145,250,40);
JLabel ps = new JLabel("密碼");
ps.setFont(font);
ps.setBounds(110,200,90,30);
JTextField psInput = new JTextField();
psInput.setFont(font);
psInput.setBounds(200,195,250,40);
f.add(user);
f.add(userInput);
f.add(ps);
f.add(psInput);
f.setLocation(300,100);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
(5)由于去掉了邊框,所以窗體不能拖動和拉伸,拖動和拉伸功能的實現(xiàn)見這篇文章swing實現(xiàn)窗體拖拽和拉伸
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringSecurity中的UserDetails和UserDetailsService接口詳解
這篇文章主要介紹了SpringSecurity中的UserDetails和UserDetailsService接口詳解,UserDetailsService 在 Spring Security 中主要承擔(dān)查詢系統(tǒng)內(nèi)用戶、驗證密碼、封裝用戶信息和角色權(quán)限,需要的朋友可以參考下2023-11-11
Java動態(tài)代理實現(xiàn)方法小結(jié)
這篇文章主要介紹了Java動態(tài)代理實現(xiàn)方法,結(jié)合實例形式總結(jié)分析了java基于JDK、CGLIB及CGLIB實現(xiàn)動態(tài)代理的相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
Java異常的幾個謎題_動力節(jié)點Java學(xué)院整理
本文給大家收藏整理java異常的幾個謎題,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06

