java jframe教程有不规则边线

似乎业界的程序员都不喜欢用java来开发图形界面,但是因为跨平台的原因,对java的桌面编程非常的感兴趣,想使用它做出一套漂亮的图形界面。
此篇文章主要介绍,java下通过swing实现win8的磁力铁
原理:继承java的swing组件,对其进行功能的扩展
java swing界面的jframe中,通过setUndecorated(true)方法可以去掉周围的边框,后果是我们没法拖动这个窗口了;以下代码提供了一种方式来解决这个问题:
运行截图(通过鼠标可以拖动一下的方块窗体):
阅读(...) 评论()博客分类:
本来这篇文章是应该上午就写好的,可是写到一半,公司无线网络居然断掉了,郁闷.....
先来张效果图吧,这是仿CF界面做的一个Demo,因为个人没有美工能力,所以这个透明PNG图片处理的十分粗糙,导致窗体看起来有锯齿.
有了上一章做理论铺垫,这一章就直接上代码吧:
* To change this template, choose Tools | Templates
* and open the template in the editor.
package cn.ysh.studio.swing.
import com.sun.awt.AWTU
import java.awt.I
import java.awt.MediaT
import java.awt.P
import java.awt.R
import java.awt.S
import java.awt.T
import java.awt.event.MouseA
import java.awt.event.MouseE
import java.awt.event.MouseMotionA
import java.awt.geom.A
import java.awt.image.PixelG
import java.io.IOE
import java.util.ArrayL
import javax.swing.JF
* @author 杨胜寒
public class CreateShape {
private JF
public CreateShape(JFrame jf, String image) throws InterruptedException, IOException {
MediaTracker mt = new MediaTracker(jf);
//获取指定图片
img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(image));
mt.addImage(img, 0);
//等待就绪
mt.waitForAll();
initialize(); //窗体初始化
private void initialize() throws IOException {
//设定窗体大小和图片一样大
jf.setSize(img.getWidth(null), img.getHeight(null));
//设定禁用窗体装饰,这样就取消了默认的窗体结构
jf.setUndecorated(true);
//初始化用于移动窗体的原点
origin = new Point();
//调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
AWTUtilities.setWindowShape(jf, getImageShape(img));
//设定窗体可见度
AWTUtilities.setWindowOpacity(jf, 0.8f);
jf.setLocationRelativeTo(null);
* 因为取消了默认的窗体结构,所以这里需要实现自定义的窗体鼠标监听
public void addDragLisener() {
jf.addMouseListener(
new MouseAdapter() {
public void mousePressed(MouseEvent e) {
origin.x = e.getX();
origin.y = e.getY();
//窗体上单击鼠标右键关闭程序
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
System.exit(0);
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
public void mouseEntered(MouseEvent e) {
jf.repaint();
jf.addMouseMotionListener(
new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Point p = jf.getLocation();
jf.setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y);
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);
pgr.grabPixels();
} catch (InterruptedException ex) {
ex.getStackTrace();
int pixels[] = (int[]) pgr.getPixels();
for (int i = 0; i & pixels. i++) {
//筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
int alpha = getAlpha(pixels[i]);
if (alpha == 0) {
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 & i++) {
for (int j = 0; j & 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 & i++) {
for (int j = 0; j & j++) {
if (matrix[i][j] == 1) {
if (temp == 0) {
} else if (j == width) {
if (temp == 0) {
Rectangle rectemp = new Rectangle(j, i, 1, 1);
rec.add(new Area(rectemp));
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
if (temp != 0) {
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
private int getAlpha(int pixel) {
return (pixel && 24) & 0
个人觉得注释写的还是蛮清楚的,在此也就不对程序代码做过多解释了,就简单说一下吧:
第一步,获取一个图片,作为裁切窗体的模板;
第二步,取消窗体默认装饰,并为其添加自定义鼠标监听,以实现常规的窗体拖动等事件;
第三步,扫描图片像素,分拣不透明像素,然后生成不规则形状,并以此裁切窗体;
第四步,设置窗体透明度,显示窗体
上述四步中,最值得说的是第三步:扫描图片像素矩阵信息,过滤透明像素,生成不规则区域,裁切窗体。
扫描像素矩阵:图片的像素信息的存储形式有点像一个矩阵(二维数组),有规则的行和列,在java中,使用PixelGrabber类可以轻易获取一张图片的像素矩阵信息,但是通过getPixels()方法返回的像素信息却是一维数组,这一点要注意,稍后会详述;
过滤透明像素:从像素数组中一次检出每个像素,检查其是否透明,如果透明则放弃该像素点,够则将像素在矩阵(注意不是上面提到的一维数组)中的坐标信息记录到两个List中;
在内存中生成不规则形状:像素分拣之后,会得到两个长度相同的List,这两个List分别记录了非透明像素点在图片像素矩阵中的X坐标和Y坐标,这里需要将二者融合到一个二维数组中,融合之后的这个二维数组,跟原始的像素矩阵一样大小,不同的是,它的的所有点只有两个值:1或0,1代表非透明点,0代表透明点。有了这个“特殊”的像素矩阵之后,还要在内存中生成不规则形状,这个稍微有点饶,我尽量说的详细一点:程序会遍历这个二维数组,跟踪每一个非透明像素(值为非0)点直到遇到一个透明点或这一行结束(简单点说,就是在每一行中检出连续的非透明点),然后基于这些点,构建一个"区域",java中由Rectangle和Area类负责构建这个"区域",最后将这些连续的或不连续的非透明块组合起来生成一个Area对象,即大功告成,成功在内存中生成了图片的形状!
裁切窗体:这个就简单了,Java Swing自带的有API接口,非常简单
AWTUtilities.setWindowShape(jf, getImageShape(img));
有兴趣的童鞋可以看看setWindowShape(Window window, Shape shape)方法的API。
使用上面这个类来成为一个指定的JFrame裁切形状就非常简单啦,看代码:
JFrame sample = new ShapWindowTest();
sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sample.setVisible(true);
sample.setTitle("Java Swing 不规则窗体范例");
原创文章,转载请注明出处:
(862.1 KB)
下载次数: 258
浏览: 238577 次
来自: 上海
求份源码,感谢楼主,
楼主你这个右上角的button按钮控件布局是怎么弄的啊
没有AWTUtilities这个类怎么办呀!!!
还有如果我想放一组user对象而不是一个怎么办呢?
请问userList.*是什么意思?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'一个会抄的开发人员才是一个合格的开发人员。
Java 透明和不规则 Swing 窗口
本机应用程序的开发人员通常在开发 UI 应用程序中享受了更高级的灵活性。但是为此而付出的代价是将应用程序限制在某一特定平台上,在许多情况中,这种灵活性不如获得更为丰富的 UI 体验和桌面紧密集成那么重要。从传统上讲,跨平台 UI 工具箱,例如 Swing、SWT、 和
趋向于被动应付众所周知的两难问题。当只有某些目标平台支持所要求的功能时怎么办?在这种情况下,模拟缺失的功能可能只会让您南辕北辙。
不规则和透明窗口是跨平台 UI 工具箱局限性的最好例子。如果在特定目标平台不支持此项功能,那么在该平台上就没有什么更多事情要做了,此项功能可能用作强有力的参数向工具箱添加该项功能。但是,Swing 开发人员社区长久以来一直争论主要目标平台不久就会提供这些功能。事实上,Windows 自从 Windows 95 ( 参见 MSDN 上的 文档
)就已经支持不规则窗口了。在 X11 中匹配功能自从 1989 年 ( 参见
PDF 文档 )就已经可用了。在 OS X 中您仅能在 JFrame 上设置透明的背景颜色。
直到现在,对跨平台透明和不规则窗口有兴趣的 Swing 应用程序有三种主要可选方式。
在显示目标窗口之前使用
捕获桌面。这种方法在 Joshua Marinacci 和 Chris Adamson 编写的
中已经进行了评述。使用 JNI 包装目标平台的本机 API。使用由 Timothy Wall 开发的 。该库在 2007 年问世,Timothy 对于
已经发表过博客。第一种方法的主要问题是要使用 Robot 类。即使您有权限获得屏幕截图,您也必须在显示窗口之前完成。此外,如何保持桌面后台同步?假设在后台正在播放 YouTube 视频。与窗口生成的事件不同( 调整大小,移动 ),AWT 并不在任何交叉窗口的重画上提供注册侦听器的任何方式。虽然 Chris 和 Joshua 通过在至少每秒内进行快照提供解决方法,这对于覆盖后台视频播放还不够。而且在每次快照前需要对窗口加以隐藏;这可能导致可见的闪烁。
使用 JNI 和 JNA 导致显著的视觉保真性改进。纯 JNI 会带来开销的急剧下降:您必须将目标平台的每一个相关的 API 绑定,还要捆绑本机库。JNA 为您分担这项重任; 它捆绑主机库并提供能在运行时提取并加载它们的类加载器。它支持 Linux、 OS X、 Windows、 Solaris 和 FreeBSD。
Consumer JRE
, 通常称作 Consumer JRE, 是 Sun 公司的努力成果,为重新配置 Java 将其作为开发富桌面应用程序的可行方法。在 Consumer JRE 中的新功能和主要改进列表相当广泛,并将特别闪耀的宝石隐藏在最新一周构建代码之一的发行说明中。 被简单地赋予“需要支持不规则/透明窗口”的标题。但是该实现核心 JDK 新功能的可能性所带给 Swing 开发人员的意义是深远的。本文的剩余部分将显示能够实现和如何实现该功能的几个示例。
在进一步研究之前,有一个非常重要的注意事项。由于 Consumer JRE 被官方认为是对稳定 JDK 发行的一个次要更新,因此在“公共”包中不能添加任何新的 API( 类、方法等等 ),例如 java.awt 或 javax.swing。在本文中讨论的所有 API 在新 com.sun.awt.AWTUtilities 类中出现,该类不是官方支持的部分 API。它在 Java SE 7 中的位置最有可能发生改变,签名方法可能在现在和最终的
Consumer JRE 发行之间发生轻微变化。所以当这种改变发生时准备更改您自己的代码。
AWTUtilities 类
我首先讨论 com.sun.awt.AWTUtilities 类,请参见
博客条目。首先我们从图 1 中的简单窗口入手:
图 1. 带有控件的窗口
要使窗口透明,您可以使用 AWTUtilities.setWindowOpacity(Window, float) 方法,如图 2 所示:
图 2. 相同的窗口,但是有 50% 的不透明度
要使窗口不规则,您可以使用 AWTUtilities.setWindowShape(Window, Shape) 方法,如图 3 所示:
图 3. 相同的窗口,但是被一个椭圆剪裁
正如您从图 3 中能看到的,不规则的窗口看起来不是很好。窗口的边缘呈锯齿状并且整体印象也不是很干净。要获得不规则窗口的更佳视觉效果,您必须使用 AWTUtilities.setWindowOpaque(Window, boolean) API,并使用柔性裁剪绘画窗口背景。这在后续的
博客条目中进行了阐明。对于窗口的左上角和右上角,该条目采用
Chris Campbell 的
以及 Romain Guy 的 ,
其中包括 Sebastien Petrucci 的改进。图 4 显示了每个像素透明的柔性裁剪窗口:
图 4. 柔性裁剪和每个像素透明的窗口
现在我们手头上已经有了这些 API,我们打算做些什么呢?对它们进行探索这种可能性当然是另人好奇的,我们正打算看看几个多样混合的示例。
让我们使应用工具提示变得透明怎么样?对于轻量级工具提示,实现这一目标是相当容易的,因为它们被作为 Swing 顶级窗口的一部分加以绘画。( 要获得关于轻量级弹出菜单的详细信息,请参见 条目。)但是,一旦工具提示成为重量级并“打破”窗口绑定,您必须继续采用 Robot 或
JNI/JNA。现在让我们看一看使用 AWTUtilities API 如何完成这项任务。
是创建弹出菜单的厂。工具提示只是弹出功能的一个例子;其他例子包括组合框下拉列表和菜单。 API
可以被用于设置自定义弹出厂,这就是我们想要做的。当前的弹出厂被用于创建所有应用弹出窗口,我们将在所有的工具提示上安装自定义不透明厂。
核心弹出厂的实现是相当复杂的。首先尝试创建轻量级弹出窗口,当要求创建重量级窗口时,系统要管理高速缓存以便重用先前创建的弹出窗口。实现过程将创建一个新的重量级弹出窗口;在相对较新的膝上型电脑上运行不同的方案还未显示任何突出的性能突破。让我们从自定义弹出厂着手研究:
public class TranslucentPopupFactory extends PopupFactory {
public Popup getPopup(Component owner, Component contents, int x, int y)
throws IllegalArgumentException {
// A more complete implementation would cache and reuse
return new TranslucentPopup(owner, contents, x, y);
TranslucentPopup 的实现相当简单。构造器创建新的 JWindow,将工具提示的不透明度设置为 0.8,从
项目安装提供拖放阴影的自定义边框:
TranslucentPopup(Component owner, Component contents, int ownerX, int ownerY) {
// create a new heavyweight window
this.popupWindow = new JWindow();
// mark the popup with partial opacity
com.sun.awt.AWTUtilities.setWindowOpacity(popupWindow,
(contents instanceof JToolTip) ? 0.8f : 0.95f);
// determine the popup location
popupWindow.setLocation(ownerX, ownerY);
// add the contents to the popup
popupWindow.getContentPane().add(contents, BorderLayout.CENTER);
contents.invalidate();
JComponent parent = (JComponent) contents.getParent();
// set the shadow border
parent.setBorder(new ShadowPopupBorder());
现在我们需要重写 Popup 的 show() 方法来标记整个弹出窗口为透明样式。这要求拖放阴影边框的每个像素具有透明性。
public void show() {
this.popupWindow.setVisible(true);
this.popupWindow.pack();
// mark the window as non-opaque, so that the
// shadow border pixels take on the per-pixel
// translucency
com.sun.awt.AWTUtilities.setWindowOpaque(this.popupWindow, false);
hide() 方法只是隐藏并处置弹出窗口:
public void hide() {
this.popupWindow.setVisible(false);
this.popupWindow.removeAll();
this.popupWindow.dispose();
要安装该弹出窗口,仅简单调用
PopupFactory.setSharedInstance(new TranslucentPopupFactory());
图 5 显示了一个具有透明工具提示的示例帧。注意,与工具提示保持视觉(透明性和拖放阴影边框)上的一致性跨越 Swing 帧绑定并扩展到后台 Eclipse 窗口。
图 5. 工具提示
现在我们做相同的动画。当工具提示显示时将颜色调淡些,当它被隐藏起来时把它的颜色渐隐如何?一旦您熟悉了AWTUtilities API,上述操作不难实现。下面给出 show() 方法的代码:
public void show() {
if (this.toFade) {
// mark the popup with 0% opacity
this.currOpacity = 0;
com.sun.awt.AWTUtilities.setWindowOpacity(popupWindow, 0.0f);
this.popupWindow.setVisible(true);
this.popupWindow.pack();
// mark the window as non-opaque, so that the
// shadow border pixels take on the per-pixel
// translucency
com.sun.awt.AWTUtilities.setWindowOpaque(this.popupWindow, false);
if (this.toFade) {
// start fading in
this.fadeInTimer = new Timer(50, new ActionListener() {
public void actionPerformed(ActionEvent e) {
currOpacity += 20;
if (currOpacity &= 100) {
com.sun.awt.AWTUtilities.setWindowOpacity(popupWindow,
currOpacity / 100.0f);
// workaround bug 6670649 - should call
// popupWindow.repaint() but that will not repaint the
popupWindow.getContentPane().repaint();
currOpacity = 100;
fadeInTimer.stop();
this.fadeInTimer.setRepeats(true);
this.fadeInTimer.start();
这时我们用 0% 的不透明度标记弹出窗口。然后我们启动重复计时器进行五次迭代。每一次跌代我们增加窗口不透明度 20% 并重新绘画。最后我们停止计时器。最终的视觉结果是工具提示外观的平滑退色序列,这一序列持续大约 250 毫秒。
hide() 方法非常类似:
public void hide() {
if (this.toFade) {
// cancel fade-in if it's running.
if (this.fadeInTimer.isRunning())
this.fadeInTimer.stop();
// start fading out
this.fadeOutTimer = new Timer(50, new ActionListener() {
public void actionPerformed(ActionEvent e) {
currOpacity -= 10;
if (currOpacity &= 0) {
com.sun.awt.AWTUtilities.setWindowOpacity(popupWindow,
currOpacity / 100.0f);
// workaround bug 6670649 - should call
// popupWindow.repaint() but that will not repaint the
popupWindow.getContentPane().repaint();
fadeOutTimer.stop();
popupWindow.setVisible(false);
popupWindow.removeAll();
popupWindow.dispose();
currOpacity = 0;
this.fadeOutTimer.setRepeats(true);
this.fadeOutTimer.start();
popupWindow.setVisible(false);
popupWindow.removeAll();
popupWindow.dispose();
首先检查退色序列是否仍在运行,根据需要将它删除。然后,不立即隐藏窗口,而是将不透明度以 10% 的增量从 100% 改为 0(因此渐隐序列是退色序列的两倍)然后隐藏并处置弹出窗口。注意两种方法参阅了 Boolean toFade变量 —— 它在工具提示上被设置为 true。弹出窗口的其他类型(菜单、组合框下拉列表)没有退色动画。
现在让我们做些更为激动人心的事情。在 Romain Guy 的博客条目
中,它显示了提供反射功能的 Swing 组件。从他与 Chet Haase 合著的
书中抽取一段测试应用程序,其中显示该组件提供了
QuickTime 电影的实时反射。在窗口绑定 之外 进行反射如何?
首先要有实际应用中的反射帧的屏幕截图。图 6 显示了正在播放 “Get a Mac” 广告的形状规则的 Swing 帧( 使用嵌入式 QuickTime 播放器 ), 伴随着覆盖桌面的透明的实时反射:
图 6. QuickTime 电影的反射
该实现重用了来自 Romain 的几个构造块并将它们扩展到“桢外”。它还有一个重画管理器 ( 要了解关于重画管理器方面的详细信息,请参见
条目 )以便将主桢内容与反射窗口保持同步。还需要在主桢上注册组件侦听器和窗口侦听器以便确保反射窗口与主窗口的可见性、位置和大小保持同步。除此之外,还要有一个自定义窗格将其内容绘画到脱屏缓冲区。脱屏缓冲区被用于绘画主桢和在反射窗口内的反射。
让我们看一下代码。主类是扩展 JFrame 的 JReflectionFrame。构造器创建了反射窗口并向其中添加非双重缓冲和透明的面板。还重写了面板的 paintComponent() 以便绘画主桢内容的反射。在初始化反射桢的位置和大小后,我们安装了一个自定义重画管理器。
public JReflectionFrame(String title) {
super(title);
reflection = new JWindow();
reflectionPanel = new JPanel() {
protected void paintComponent(Graphics g) {
// paint the reflection of the main window
paintReflection(g);
// mark the panel as non-double buffered and non-opaque
// to make it translucent.
reflectionPanel.setDoubleBuffered(false);
reflectionPanel.setOpaque(false);
reflection.setLayout(new BorderLayout());
reflection.add(reflectionPanel, BorderLayout.CENTER);
// register listeners - see below
// initialize the reflection size and location
reflection.setSize(getSize());
reflection.setLocation(getX(), getY() + getHeight());
reflection.setVisible(true);
// install custom repaint manager to force re-painting
// the reflection when something in the main window is
// repainted
RepaintManager.setCurrentManager(new ReflectionRepaintManager());
下面是保持反射窗口与主桢同步的侦听器:
this.addComponentListener(new ComponentAdapter() {
public void componentHidden(ComponentEvent e) {
reflection.setVisible(false);
public void componentMoved(ComponentEvent e) {
// update the reflection location
reflection.setLocation(getX(), getY() + getHeight());
public void componentResized(ComponentEvent e) {
// update the reflection size and location
reflection.setSize(getWidth(), getHeight());
reflection.setLocation(getX(), getY() + getHeight());
public void componentShown(ComponentEvent e) {
reflection.setVisible(true);
// if the reflection window is opaque, mark
// it as per-pixel translucent
if (com.sun.awt.AWTUtilities.isWindowOpaque(reflection)) {
com.sun.awt.AWTUtilities.setWindowOpaque(reflection, false);
this.addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
// force showing the reflection window
reflection.setAlwaysOnTop(true);
reflection.setAlwaysOnTop(false);
重画管理器相当简单:它强制主桢的整个根窗格重画,然后更新反射窗口。这样可以最优化更新区域反射的同步,对于示例应用程序要达到的目的,这点就足够了。
private class ReflectionRepaintManager extends RepaintManager {
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
Window win = SwingUtilities.getWindowAncestor(c);
if (win instanceof JReflectionFrame) {
// mark the entire root pane to be repainted
JRootPane rp = ((JReflectionFrame) win).getRootPane();
super.addDirtyRegion(rp, 0, 0, rp.getWidth(), rp.getHeight());
// workaround bug 6670649 - should call reflection.repaint()
// but that will not repaint the panel
reflectionPanel.repaint();
super.addDirtyRegion(c, x, y, w, h);
主桢 (脱屏缓冲区) 和反射窗口的绘图代码在 Romain 的
中进行了详细描述。
对这一结果我们期待已久,现在终于如愿以偿。尽管创建透明和不规则窗口的 API 还没有官方支持的包,但是它们仍可用于创建可视的富跨平台 UI。从 Romain 的博客
条目展示 JNA 项目,用于创建动画的透明不规则窗口的可视化竞争应用。现在您可以使用核心 JDK 做同样的处理。本文全面介绍了显示实际应用中的核心 JDK API 的三个示例。我确信您能想出更多的例子。
本文的 。Swing 绘画流水线的 关于使用
类来模拟透明窗口的相关 章节, 出自 Joshua Marinacci 和 Chris Adamson 编著的Swing Hacks由 Timothy Wall 编著的 在 Consumer JRE 中创建透明和不规则窗口的基本 API 在 Consumer JRE 中创建每像素透明和柔性裁剪的不规则窗口的 由 Romain Guy 编写的关于创建透明反射 由 Chris Campbell 编写的关于柔性裁剪 视频反射组件的 ,出自 Chet Haase 和 Romain Guy 编著的《肮脏的富客户机》。 在读初中时就开始编写软件,获得计算机科学专业的学士学位后,他继续从事这方面的工作。他感兴趣的主要领域包括桌面应用程序、成像算法和高级 UI 技术。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!效果截图:
这几天静心学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.背景图形的绘制:这个很感谢那个大神,我搜了很久终于搜到了这个算法:
3 import java.awt.I
4 import java.awt.R
5 import java.awt.S
6 import java.awt.geom.A
7 import java.awt.image.PixelG
8 import java.util.ArrayL
10 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);
pgr.grabPixels();
} catch (InterruptedException ex) {
ex.getStackTrace();
int pixels[] = (int[]) pgr.getPixels();
for (int i = 0; i & pixels. i++) {
//筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
int alpha = getAlpha(pixels[i]);
if (alpha == 0) {
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 & i++) {
for (int j = 0; j & 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 & i++) {
for (int j = 0; j & j++) {
if (matrix[i][j] == 1) {
if (temp == 0) {
} else if (j == width) {
if (temp == 0) {
Rectangle rectemp = new Rectangle(j, i, 1, 1);
rec.add(new Area(rectemp));
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
if (temp != 0) {
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp));
private int getAlpha(int pixel) {
return (pixel && 24) & 0xff;
这个算法可以将图片alpha=0的部位直接剔除掉并得到一个新的图形,使用com.sun.awt.AWTUtilities.setWindowShape感觉是拿这个图形对窗体背景进行遮罩:
因此,还要将想要的背景图重新添加到窗体上【注:高宽位置正好要对准】。
好了,然后直接在这个窗体上添加所需要的控件。
4.窗体的拖动:
拖动的话我是在当前Frame顶部添加了一个JLabel:然后添加拖动事件:
3 this.dragbar.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
getlocationPoint(e);
this.dragbar.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
dragwindow(e);
19 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);
阅读(...) 评论()}

我要回帖

更多关于 java jframe透明 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信