swing重繪按鈕為任意形狀圖案的方法
swing自帶的metalButton是非常丑的,不能滿(mǎn)足我們的實(shí)際需求,所以需要定制自己喜歡的按鈕,比如一個(gè)圖片按鈕等等。如下圖所示。
接著說(shuō)明如何制作。
(1)找一些好看的按鈕圖片,但是按鈕可能在圖片內(nèi)部,所以我們需要用美圖秀秀或者PS將按鈕摳出來(lái)。如下圖:
(2)將其保存為透明背景就可以了。
(3)然后寫(xiě)一個(gè)我的按鈕類(lèi):
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è)置按鈕點(diǎn)擊范圍僅在圖片的非透明區(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){ //當(dāng)搜索到透明區(qū)域時(shí),就getRGB拋出下表越界異常 return false; } } }
上面的程序重寫(xiě)了contains函數(shù)保證黨鼠標(biāo)點(diǎn)擊區(qū)域限制在圖片的有效區(qū)域內(nèi)。
(4)寫(xiě)一個(gè)Demo類(lèi)測(cè)試:
import javax.swing.*; import java.awt.*; import java.net.URL; public class Demo { public Demo(){ JFrame jf=new JFrame("任意形狀圖片按鈕測(cè)試"); 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); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單了解SpringBoot過(guò)濾器及使用方式
這篇文章主要介紹了簡(jiǎn)單了解SpringBoot過(guò)濾器及使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04jfinal添加jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法
這篇文章主要介紹了jfinal的jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法,大家參考使用吧2014-01-01Java多線(xiàn)程中的wait與notify方法詳解
這篇文章主要介紹了Java多線(xiàn)程中的wait與notify方法詳解,線(xiàn)程的調(diào)度是無(wú)序的,但有些情況要求線(xiàn)程的執(zhí)行是有序的,因此,我們可以使用 wait() 方法來(lái)使線(xiàn)程執(zhí)行有序,需要的朋友可以參考下2023-08-08JAVA實(shí)現(xiàn)紅包分發(fā)的示例代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)紅包分發(fā)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java手把手必會(huì)的實(shí)例漢諾塔講解練習(xí)
漢諾塔,傳說(shuō)神在創(chuàng)造世界的時(shí)候做了三根金剛石柱子,并在一個(gè)教塔里留下了三根金剛石棒,第一根上面從上到下套著64個(gè)按從小到大排列的金盤(pán),神命令廟里的眾僧將它們一個(gè)個(gè)地從這根金剛石棒搬到另一根金剛石棒上,大盤(pán)不能放在小盤(pán)上。最后64個(gè)金盤(pán)仍然要按從小到大排列2021-09-09mybatis-plus團(tuán)隊(duì)新作mybatis-mate實(shí)現(xiàn)數(shù)據(jù)權(quán)限
本文主要介紹了mybatis-plus 團(tuán)隊(duì)新作 mybatis-mate 輕松搞定數(shù)據(jù)權(quán)限,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息
最近在開(kāi)發(fā)中需要從request中獲取操作系統(tǒng),瀏覽器及瀏覽器版本信息,所以下面這篇文章主要給的大家介紹了關(guān)于Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Spring-全面詳解(學(xué)習(xí)總結(jié))
這篇文章主要介紹了詳解Spring框架入門(mén),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你帶來(lái)幫助2021-07-07Mybatis 實(shí)現(xiàn)打印sql語(yǔ)句的代碼
這篇文章主要介紹了Mybatis 實(shí)現(xiàn)打印sql語(yǔ)句的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07