swing重绘按钮为任意形状图案的方法
摘自https://www.jb51.net/article/131290.htm
转载 更新时间:2017年12月22日 13:43:00 作者:_Thomas 我要评论
这篇文章主要为大家详细介绍了swing重绘按钮为任意形状图案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
swing自带的metalButton是非常丑的,不能满足我们的实际需求,所以需要定制自己喜欢的按钮,比如一个图片按钮等等。如下图所示。
接着说明如何制作。
(1)找一些好看的按钮图片,但是按钮可能在图片内部,所以我们需要用美图秀秀或者PS将按钮抠出来。如下图:
(2)将其保存为透明背景就可以了。
(3)然后写一个我的按钮类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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类测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。