swing重繪按鈕為任意形狀圖案的方法
swing自帶的metalButton是非常丑的,不能滿足我們的實際需求,所以需要定制自己喜歡的按鈕,比如一個圖片按鈕等等。如下圖所示。
接著說明如何制作。
(1)找一些好看的按鈕圖片,但是按鈕可能在圖片內(nèi)部,所以我們需要用美圖秀秀或者PS將按鈕摳出來。如下圖:
(2)將其保存為透明背景就可以了。
(3)然后寫一個我的按鈕類:
import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; public class newButton extends JButton{ ImageIcon img; public newButton(String icon){ super(); this.img = new ImageIcon(Demo.class.getResource(icon)); setBorderPainted(false); setContentAreaFilled(false); setOpaque(false); setSize(img.getIconWidth(),img.getIconHeight()); try{ bi = ImageIO.read(Demo.class.getResource(icon)); }catch(Exception e){ JOptionPane.showMessageDialog(this,"可能是圖片文件不存在","ImageIO異常",JOptionPane.ERROR_MESSAGE); System.exit(0); } } @Override public void paintComponent(Graphics g){ if(this.getModel().isPressed()){ g.drawImage(img.getImage(),1,1,this); }else{ g.drawImage(img.getImage(),0,0,this); } super.paintComponent(g); } BufferedImage bi ; int rgb,alpha; /** * 設(shè)置按鈕點擊范圍僅在圖片的非透明區(qū)域。 */ @Override public boolean contains(int x,int y){ try{ rgb = bi.getRGB(x,y); alpha = (rgb>>24)&0xFF; if(alpha==0){ return false; }else{ return true; } }catch(ArrayIndexOutOfBoundsException e){ //當搜索到透明區(qū)域時,就getRGB拋出下表越界異常 return false; } } }
上面的程序重寫了contains函數(shù)保證黨鼠標點擊區(qū)域限制在圖片的有效區(qū)域內(nèi)。
(4)寫一個Demo類測試:
import javax.swing.*; import java.awt.*; import java.net.URL; public class Demo { public Demo(){ JFrame jf=new JFrame("任意形狀圖片按鈕測試"); jf.setBounds(500,200,700,500); myJPanel jp = new myJPanel(Demo.class.getResource("bg.jpg")); jp.setLayout(null); newButton jb1 = new newButton("bt1.png"); jb1.setLocation(44,44); jp.add(jb1); jb1 = new newButton("snowFlower.png"); jb1.setLocation(200,44); jp.add(jb1); jb1 = new newButton("bt2.png"); jb1.setLocation(350,64); jp.add(jb1); jb1 = new newButton("bt3.png"); jb1.setLocation(450,64); jp.add(jb1); jf.add(jp); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); } public static void main(String[] args){ new Demo(); } private class myJPanel extends JPanel{ ImageIcon bg; public myJPanel(URL bg) { this.setOpaque(false);//要設(shè)置為透明。 this.bg = new ImageIcon(bg); } //用于設(shè)置背景圖片 @Override public void paintComponent(Graphics g){ g.drawImage(bg.getImage(),0,0,this.getWidth(),this.getHeight(),this); super.paintComponent(g); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis-plus團隊新作mybatis-mate實現(xiàn)數(shù)據(jù)權(quán)限
本文主要介紹了mybatis-plus 團隊新作 mybatis-mate 輕松搞定數(shù)據(jù)權(quán)限,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息
最近在開發(fā)中需要從request中獲取操作系統(tǒng),瀏覽器及瀏覽器版本信息,所以下面這篇文章主要給的大家介紹了關(guān)于Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-10-10Spring-全面詳解(學(xué)習(xí)總結(jié))
這篇文章主要介紹了詳解Spring框架入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你帶來幫助2021-07-07