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文件管理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. grpc asp.net core 集成时一些配置的说明

    一  什么是grpc google出了一款分布式通讯框架:grpc.我想这也不是新的东西了,在13年的一个项目中,用在了数据层和业务端之间的通讯上,当时并没有觉得怎么样,因为wcf很轻松的也可以可以实 ...

  3. vue切换样式

    在vue中使用事件来切换绑定的class样式,在vue-cli脚手架中的Home.vue中 <template> <div id="main"> <l ...

  4. 1、Monkey入门准备教程

    1.前提需要Android环境 ADT:链接: https://pan.baidu.com/s/1QN6EJh46cJGvUBaMZjtiWw 密码: a7zu Eclipse:https://www ...

  5. Poj 1631 Bridging signals(二分+DP 解 LIS)

    题意:题目很难懂,题意很简单,求最长递增子序列LIS. 分析:本题的最大数据40000,多个case.用基础的O(N^2)动态规划求解是超时,采用O(n*log2n)的二分查找加速的改进型DP后AC了 ...

  6. UML解析

    1.1 UML基础知识扫盲 UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言. 你可能会问:这明明是一种图形,为什 ...

  7. struts2中常用constant命令配置

    struts.objectFactory这个属性用 于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Sp ...

  8. 一张图看懂------left join;right join;inner join

  9. 此上下文中不允许异步操作。启动异步操作的页必须将 Async 特性设置为 true,并且异步操作只能在 PreRenderComplete 事件之前的页上启动。

    <%@ Page Language="C#" AutoEventWireup="true" ...... Async="true" % ...

  10. java 多线程系列---JUC原子类(五)之AtomicLongFieldUpdater原子类

    AtomicLongFieldUpdater介绍和函数列表 AtomicLongFieldUpdater可以对指定"类的 'volatile long'类型的成员"进行原子更新.它 ...