JFrame 不规则窗体
效果截图:

这几天静心学java,由于学的不是很好,也没有什么有什么可以作品,但是毕竟也算刚开始认真学,也遇到了好多问题;
首先
1. JFrame的无边框设置:JFrame.setUndecorated(true);这个属性网上提到的很多;是在JFrame在显示情况下(JFrame.setVisible(true);)能去掉JFrame默认的标题和边框。
2.背景图形设置:com.sun.awt.AWTUtilities.setWindowShape(Window w,Shape s);这个是jre里面自带的一个rt.jar包,但说有查到说使用这个包之后程序就不会有跨平台性,但是也可以引用第三方库 jna.jar + platform.jar 提供的WindowUtils类可以实现快平台,以后我试试吧。
3.背景图形的绘制:这个很感谢那个大神,我搜了很久终于搜到了这个算法:
package object; import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.image.PixelGrabber;
import java.util.ArrayList; public class getImage {
public Shape getImageShape(Image img) {
ArrayList<Integer> x = new ArrayList<Integer>();
ArrayList<Integer> y = new ArrayList<Integer>();
int width = img.getWidth(null);//图像宽度
int height = img.getHeight(null);//图像高度 //筛选像素
//首先获取图像所有的像素信息
PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
try {
pgr.grabPixels();
} catch (InterruptedException ex) {
ex.getStackTrace();
}
int pixels[] = (int[]) pgr.getPixels();
for (int i = 0; i < pixels.length; i++) {
//筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
int alpha = getAlpha(pixels[i]);
if (alpha == 0) {
continue;
} else {
x.add(i % width > 0 ? i % width - 1 : 0);
y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width);
}
}
int[][] matrix = new int[height][width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
matrix[i][j] = 0;
}
} //导入坐标ArrayList中的不透明坐标信息
for (int c = 0; c < x.size(); c++) {
matrix[y.get(c)][x.get(c)] = 1;
} Area rec = new Area();
int temp = 0; for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (matrix[i][j] == 1) {
if (temp == 0) {
temp = j;
} else if (j == width) {
if (temp == 0) {
Rectangle rectemp = new Rectangle(j, i, 1, 1);
rec.add(new Area(rectemp));
} else {
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
temp = 0;
}
}
} else {
if (temp != 0) {
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
temp = 0;
}
}
}
temp = 0;
}
return rec;
} private int getAlpha(int pixel) {
return (pixel >> 24) & 0xff;
}
}
这个算法可以将图片alpha=0的部位直接剔除掉并得到一个新的图形,使用com.sun.awt.AWTUtilities.setWindowShape感觉是拿这个图形对窗体背景进行遮罩:

因此,还要将想要的背景图重新添加到窗体上【注:高宽位置正好要对准】。

好了,然后直接在这个窗体上添加所需要的控件。
4.窗体的拖动:
拖动的话我是在当前Frame顶部添加了一个JLabel:然后添加拖动事件:

//...
this.dragbar.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
getlocationPoint(e);
}
});
this.dragbar.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
dragwindow(e);
}
});
//...
protected void getlocationPoint(MouseEvent e) {
this.px1=e.getX();
this.py1=e.getY();
}
protected void dragwindow(MouseEvent e) {
JLabel bar=(JLabel)e.getSource();
int xx=this.jf.getX()+e.getX()-this.px1;
int yy=this.jf.getY()+e.getY()-this.py1;
this.jf.setLocation(xx, yy);
}
JFrame 不规则窗体的更多相关文章
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如 WPF中不规则窗体与WebBrowser控件的兼 ...
- QT实现不规则窗体
看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式,我使用了png格式,默认 ...
- WPF界面设计技巧(1)—不规则窗体图文指南
原文:WPF界面设计技巧(1)-不规则窗体图文指南 初到园子,奉上第一篇入门级教程,请勿见笑. 以往WinForm编程中,实现不规则窗体是有一定难度的,更难的是不规则窗体的边缘抗锯齿及局部透明处理.而 ...
- WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...
- [小结][N种方法]实现WPF不规则窗体
原文:[小结][N种方法]实现WPF不规则窗体 WPF实现不规则窗体,方法很多很多多.... 本文总结DebugLZQ认为简洁高效的几种方法 实现WPF不规则窗体的几种常用的方法如下: 1.使用Ble ...
- WPF设计の不规则窗体
我们在工作中,经常会需要画一些不规则的窗体,现在总结如下. 一.利用VisualBrush实现.这依赖于VisualBrush的特性,任何控件可以作为画刷,而画刷又可以作为背景. 此种方法可以用于实现 ...
- Delphi 实现不规则窗体
最近为了要兼容XP系统(守旧的市场),又需要做出产品的特效,不得不从头学习一下这门 “聪明的语言” . 开发环境: win10 Delphi 10.2 Version 25.0.26309.314 产 ...
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- delphi 不规则窗体与桌面宠物
二.支持区域操作的编程接口在Windows的API函数中有一组用于区域操作的函数,可以用来生成区域.合并区域.获取区域数据.根据数据生成区域.把区域和窗体联系等,其中常用的几个函数有:生成矩形区域的C ...
随机推荐
- 【转】libvirt kvm 虚拟机上网 – Bridge桥接
libvirt kvm 虚拟机上网 – Bridge桥接 2013 年 7 月 3 日 / 东东东 / 暂无评论 目录 [hide] 1 Bridge桥接原理 2 在host机器配置桥接网络 2.1 ...
- bzoj4709 [jsoi2011]柠檬
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们 ...
- Visual Assist 生成注释功能
在Visual Studio环境中编码,Visual Assist是不可缺少的好工具.这工具功能非常强大,以前仅仅用到了代码提示,今天学习了生成注释功能,非常爽. 在代码编辑器中点击右键弹出菜单,在“ ...
- db4o种纯对象数据库引擎
db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(废话--,不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大 ...
- "aa".equals(name)这种写法为什么就可以避免空指针
public static void main(String[] args) { String name=null; if("aa".equals(name))//这种情形,不出现 ...
- C语言每日一题之No.7
今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...
- IOS中UIWebView停止加载
方法一: [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank" ...
- 3. Map与Tuple
一. Map 对偶 (1)对偶是一个映射.多个对偶形成map (2)对偶的表示:(k,v)或者k->v Map(哈希类型) (1)map的声明与查询 scala> val map1 = M ...
- Firmware综述
软件的层次关系(从底层到高层)如下: 1. PSP (Processor Support Package). A group of file that are specific to a CPU ty ...
- 配置文件——WebApp.config文件读取和修改
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...