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. php操作EXCLE(通过phpExcle实现读excel数据)

    <?phprequire_once('/PHPExcel/Reader/Excel2007.php');$objReader = new PHPExcel_Reader_Excel2007;$P ...

  2. Zijian-lv #3 树句节狗提

    如你所见,这是一道狗题 一棵树,多次询问与一个点距离至少为 $k$ 的点的权值和 $n,q \leq 2525010$ sol: 长链剖分 需要注意的是这道题卡空间 我把我所有的 vector 换成链 ...

  3. 日志收集系统搭建-BELK

    前言 日志是我们分析系统运行情况.问题定位.优化分析等主要数据源头.目前,主流的业务系统都采用了分布式.微服务的形式.如果想要查看日志,就需要从不同的节点上去查看,而且对于整个业务链路也非常不清晰.因 ...

  4. Java基础--阻塞队列ArrayBlockingQueue

    ArrayBlockingQueue是阻塞队列的一种,基于数组实现,长度固定,队尾添加,队首获取, 构造函数: ArrayBlockingQueue(int capacity) ArrayBlocki ...

  5. java代码split分割数字类

    总结:正则表达式-- package com.c2; //写一个spli的用法,数字类 ===分割字符串 public class yqw { public static void main(Stri ...

  6. oralce 记一次 External Procedure initial connection 处理

    1 环境 oracle 11.2.0.4 RAC(2 nodes),centos 6.8,实体机 2 问题 线上环境执行一条sql sql> select ST_AsText(ST_Geomet ...

  7. 版本管理 word 文档比较

    1.因为公司还在用SVN, 2.而且 还在用word 写文档, 3.而且 commit log 基本不写, 所以导致,想了解word文档 改动, 很浪费时间!!!! 所以想 快速了解word 改动, ...

  8. Spring MVC配置详解(2)---bai

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  9. catkin 工作空间

    catkin 工作空间:组织和管理功能包的文件夹,以 catkin 工具编译 建立工作空间 sch01ar@ubuntu:~$ mkdir -p ~/catkin_ws/src sch01ar@ubu ...

  10. PowerDesigner中添加约束

    唯一约束 唯一约束与创建唯一索引基本上是一回事,因为在创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束.不过唯一约束更直观的表达了对应列的唯一性,使得对应索引的目的更加清晰,所 ...