swing重绘按钮为任意形状图案的方法

swing自带的metalButton是非常丑的,不能满足我们的实际需求,所以需要定制自己喜欢的按钮,比如一个图片按钮等等。如下图所示。

接着说明如何制作。

(1)找一些好看的按钮图片,但是按钮可能在图片内部,所以我们需要用美图秀秀或者PS将按钮抠出来。如下图:

(2)将其保存为透明背景就可以了。

(3)然后写一个我的按钮类:

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类测试:

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

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

(0)

相关推荐

  • java基础之标签、按钮和按钮事件简介

    标签和按钮也许是图形界面中最常见的两种组件,按钮又总是与激发动作事件有关. 标签 标签(JLabel)是最简单的Swing组件.标签对象的作用是对位于其后的界面组件作说明.可以设置标签的属性,即前景色,背景色.字体等,但不能动态地编辑标签中的文本. 程序关于标签的基本内容有以下几个方面: 1.声明一个标签名: 2.创建一个标签对象: 3.将标签对象加入到某个容器. JLabel类的主要构造方法是: 1.JLabel ():构造一个无显示文字的标签: 2.JLabel (String s):构造一

  • java代码块之简易qq登录界面及按钮颜色设置代码

    本文主要分享了关于简洁版qq登录界面及按钮颜色设置的相关代码,供参考. java代码块 公共包(初始化窗口位置) package util; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; //图形化界面的工具类 public class FrameUtil { //设置窗体出现在中间位置 public static void initFrame(JFrame frame,int wid

  • java中添加按钮并添加响应事件的方法(推荐)

    关于Java容器,面板等自行百度学一下吧 </pre><pre name="code" class="java">private Button LogInbtn = new Button("登陆"); final static JFrame buyerpagemain = new JFrame(); final Container contentPane = buyerpagemain.getContentPane();

  • java选择框、单选框和单选按钮

    选择框.单选框和单选按钮都是选择组件,选择组件有两种状态,一种是选中(on),另一种是未选中(off),它们提供一种简单的 "on/off"选择功能,让用户在一组选择项目中作选择. 选择框 选择框(JCheckBox)的选中与否开状是一个小方框,被选中则在框中打勾.当在一个容器中有多个选择框,同时可以有多个选择框被选中,这样的选择框也称复选框.与选择框相关的接口是ItemListener,事件类是ItemEvent. JCheckBox类常用的构造方法有以下3个: 1.JCheckBo

  • java按钮控件数组实现计算器界面示例分享

    思路如下: 创建一个类,通过extends使其继承窗体类JFrame:创建一个JFrame对象,使用JFrame类的setVisible()方法设置窗体可见:在构造函数中,使用super()方法继承父类的构造方法:使用setTitle()方法设置窗体的标题:使用setBounds()方法设置窗体的显示位置及大小:使用setDefaultCloseOperation()方法设置窗体关闭按钮的动作为退出:使用GridLayout创建网格布局管理器对象:使用GridLayout类的setHgap()方

  • Java编程实现swing圆形按钮实例代码

    Swing是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT.它们是JFC的一部分.它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们.这意味着你可以在任意平台上使用JAVA支持的任意面板.轻量级组件的缺点则

  • java处理按钮点击事件的方法

    不同的事件源可以产生不同类别的事件.例如,按钮可以发送一个ActionEvent对象,而窗口可以发送WindowEvent对象. AWT时间处理机制的概要: 1. 监听器对象是一个实现了特定监听器接口(listener interface)的类的实例. 2. 事件源是一个能够注册监听器对象并发送事件对象的对象. 3. 当事件发生时,事件源将事件对象传递给所有注册的监听器. 4. 监听器对象将利用事件对象中的信息决定如何对事件做出响应. 下面是监听器的一个示例: ActionListener li

  • swing重绘按钮为任意形状图案的方法

    swing自带的metalButton是非常丑的,不能满足我们的实际需求,所以需要定制自己喜欢的按钮,比如一个图片按钮等等.如下图所示. 接着说明如何制作. (1)找一些好看的按钮图片,但是按钮可能在图片内部,所以我们需要用美图秀秀或者PS将按钮抠出来.如下图: (2)将其保存为透明背景就可以了. (3)然后写一个我的按钮类: import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.aw

  • Java Swing实现窗体添加背景图片的2种方法详解

    本文实例讲述了Java Swing实现窗体添加背景图片的2种方法.分享给大家供大家参考,具体如下: 在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1. 利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体.这是一个很取巧的办法,代码非常简单,如下所示. JLabel lbBg = new JLabel(imageIcon); lbBg.setBound

  • 高性能WEB开发 页面呈现、重绘、回流。

    页面呈现流程 在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类似的. 1. 浏览器把获取到的html代码解析成1个Dom树,html中的每个tag都是Dom树中的1个节点,根节点就是我们常用的document对象(<html> tag).dom树就是我们用firebug或者IE Developer Toolbar等工具看到的html结构,里面包

  • 使用重绘项美化WinForm的控件

    如果你觉得项目中的ComboBox.ListBox或其它的Winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式.下面的示例完成对ComBox数据项的重绘,希望能起到抛砖引玉的作用. 显示源代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

  • 浅谈DOM的操作以及性能优化问题-重绘重排

    写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳"过桥费",访问DOM的次数越多,费用也就越高.因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上.我们不可能不用DOM的接口,那么,怎样才能提高程序的效率? 既然

  • 基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)

    本文为大家分享了四个jquery图片常见操作,供大家参考,具体内容如下 1.关于图片大小的重绘,你可以在服务端来实现,也可以通过JQuery在客户端实现. $(window).bind("load", function() { // IMAGE RESIZE $('#product_cat_list img').each(function() { var maxWidth = 120; var maxHeight = 120; var ratio = 0; var width = $(

  • 高性能JavaScript 重排与重绘(2)

    先回顾下前一篇文章高性能JavaScript DOM编程,主要提了两点优化,一是尽量减少DOM的访问,而把运算放在ECMAScript这一端,二是尽量缓存局部变量,比如length等等,最后介绍了两个新的API querySelector()以及querySelectorAll(),在做组合选择的时候可以大胆使用.而本文主要讲的是DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数

  • 自定义jQuery插件方式实现强制对象重绘的方法

    本文实例讲述了自定义jQuery插件方式实现强制对象重绘的方法.分享给大家供大家参考.具体实现方法如下: jQuery.fn.redraw = function(){ jQuery(this).each(function(){ this.style.display='none'; this.offsetHeight; // no need to store this anywhere, the reference is enough this.style.display='block'; });

  • Opencv使用鼠标任意形状的抠图

    本文实例为大家分享了Opencv使用鼠标任意形状抠图的具体代码,供大家参考,具体内容如下 主要的方法思路是:首先利用鼠标在图上画任意形状,利用掩码将任意形状抠出来 主要难点是怎么填充,因为鼠标在画线的时候,滑动越快,点是不连续的,利用floodFill和drawContours都是没有办法进行填充的,从另一个方面想,一个面是由很多个点组成的,虽然鼠标滑动保存下来的就是一系列点,可以利用这一系列点构成一个面,利用面的性质进行填充就比较简单了. 一.首先使用鼠标点击事件,鼠标点击事件的函数为: vo

  • 了解重排与重绘

    前言 浏览器下载完页面中的所有内容:HTML.JavaScript.CSS.图片--之后会解析并生成两个内部数据结构: DOM树:表示页面结构 渲染树:表示DOM节点如何显示 DOM树中的每一个需要显示的节点在渲染树中至少存在一个对应的节点(隐藏的DOM元素在渲染树中没有对应的节点).渲染树中的节点被称为"帧"或者"盒子",理解页面元素为一个具有填充(padding).边距(margin).边框(border)和位置(position)的盒子.一旦DOM树和渲染树构

随机推荐