swing自帶的metalButton是非常丑的,不能滿足我們的實際需求,所以需要定制自己喜歡的按鈕,比如一個圖片按鈕等等。如下圖所示。
接著說明如何制作。
(1)找一些好看的按鈕圖片,但是按鈕可能在圖片內部,所以我們需要用美圖秀秀或者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; /** * 設置按鈕點擊范圍僅在圖片的非透明區域。 */ @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){ //當搜索到透明區域時,就getRGB拋出下表越界異常 return false; } } }
上面的程序重寫了contains函數保證黨鼠標點擊區域限制在圖片的有效區域內。
(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);//要設置為透明。 this.bg = new ImageIcon(bg); } //用于設置背景圖片 @Override public void paintComponent(Graphics g){ g.drawImage(bg.getImage(),0,0,this.getWidth(),this.getHeight(),this); super.paintComponent(g); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選