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. memcache内存分配问题

    Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用.这里简单谈一下我对me ...

  2. LeetCode Employee Importance

    原题链接在这里:https://leetcode.com/problems/employee-importance/description/ 题目: You are given a data stru ...

  3. NET代码运行在服务器JS运行在客户端

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;usi ...

  4. NB-LOT 科普

    最全科普!你一定要了解的NB-IoT 2017-06-19 21:04物联网/操作系统/科普 工信部下发通知推动150万NB-IoT基站落地.NB-IoT汹涌而来.很多网友要求雇佣军科普一篇NB-Io ...

  5. 机器学习:SVM(基础理解)

    一.基础理解 1)简介 SVM(Support Vector Machine):支撑向量机,既可以解决分类问题,又可以解决回归问题: SVM 算法可分为:Hard Margin SVM.Soft Ma ...

  6. HashSet中是如何判断元素是否重复的

    HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素: 如果已存在则调用Obje ...

  7. iOS中的数据存储

    SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite3常用的4种 ...

  8. 2014.10.1 Word技巧

    设置每页都出现的表头 wordDoc.Tables[tab].Rows[1].HeadingFormat = (int)Word.WdConstants.wdToggle; //合并单元格 wordD ...

  9. java selenium webdriver第一讲 seleniumIDE

    Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...

  10. object类型对象 ref参数如何理解?

    class Program { static void Main(string[] args) { Student stu = new Student { Name = "老王" ...