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);
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

swing重绘按钮为任意形状图案的方法的更多相关文章

  1. WinForm中的重绘 - 按钮等控件的背景渐变色重绘

    注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. private void PaintGradientBackground(Button ...

  2. Windows开发进阶之VC++中如何实现对话框的界面重绘

    技术:Windows 系统+Visual studio 2008   概述 应用程序界面是用户与应用程序之间的交互的桥梁和媒介,用户界面是应用程序中最重要的组成部分,也是最为直观的视觉体现.对用户而言 ...

  3. 跟我一起玩Win32开发(3):窗口的重绘

    c可以编译#include <Windows.h> //先声明一下消息处理函数 LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPA ...

  4. swing容器继承重绘问题解决

    swing容器继承重绘问题解决   以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码: package ui; import java.awt.Grap ...

  5. UITextField的常用属性,Delegate,重绘

        一  属性 UITextField * myTextField = [[UITextField alloc] initWithFrame:CGRectMake(50, 100, 200, 50 ...

  6. 玩转控件:重写/重绘Dev中MessageBox弹窗控件

    很久没有更新博客了,本想着直接发一篇<手撕ERP>系列,从控件重写.重绘,到框架搭建,再到部分模块实现+业务的.但是每次动手的时候,都觉得难以下手.直接从数据库设计开始吧,模块设计还没定下 ...

  7. iOS 视图:重绘与UIScrollView(内容根据iOS编程编写)

    我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import " ...

  8. win32自绘按钮,使用GDI+(二)

    一.解决上一篇的两个问题. 1.按钮背景透明 方法是,在绘制按钮之前,向按钮的父窗口发生WM_CTLCOLORBTN消息.该消息返回一个画刷句柄,系统使用该画刷句柄画出按钮的背景.所以我们在处理这个消 ...

  9. Android视图状态及重绘流程分析,带你一步步深入了解View(三)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程, ...

随机推荐

  1. New Concept English three (55)

    28w/m 45errors Recent developments in astronomy have made it possible to detect planets in our won M ...

  2. 基于Seajs的可控台球碰撞游戏

    前言 不记得哪个黑色星期五,贪吃鱼基本完工的时候,产品突然增加需求,要求金币扔出去后不消失,互相可碰撞,其最终结果还要由服务器控制(没错,至今做的所有游戏都有幕后黑手,=W=). 对于碰撞以前只写过一 ...

  3. Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

    数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当 ...

  4. swing之flowlayout

    import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 // ...

  5. 学习动态性能表(11)v$latch$v$latch_children

    学习动态性能表 第十一篇-(1)-V$LATCH  2007.6.7 Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串 ...

  6. LoadRunner几个重要的概念:事务、集合点、思考时间

    在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间 事务: 事务又称为Transaction,在LoadRunner中的定义如下:An end-to-end(browser- ...

  7. [转]Cache-Control max-age=0

    Cache-Control max-age=0   Cache-Control  no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验.这对于需要确认认证应用很有用(可以和 ...

  8. javascript switch continue break 执行语句

    1:switch 关键字段:switch(n).case.break.default switch(n) :n是一个表达式 或者是一变量,用来与其下的各种case进行匹配,比如:此时的day输出的是 ...

  9. 命令行启动MySQL

    1 首先打开CMD,即命令行 输入mysqld ,如出现 则说明MySQL安装路径下的bin不在系统的环境变量中,你需要进入它的安装路径的bin目录下启动. ps:如果你不知道路径可以去开始菜单,找到 ...

  10. 感知机学习算法Java实现

    感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...