Java 创建不规则窗口

import com.sun.awt.AWTUtilities;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Area;
import java.awt.image.PixelGrabber;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFrame;

public class createShape
{
  private Image img;
  private JFrame jf;
  private Point origin;
 
  public createShape(JFrame jf, String image)
  {
    this.jf = jf;
    MediaTracker mt = new MediaTracker(jf);
    this.img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(image));
    mt.addImage(this.img, 0);
    try
    {
      mt.waitForAll();
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    try
    {
      initialize();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
 
  private void initialize()
    throws IOException
  {
    this.jf.setSize(this.img.getWidth(null), this.img.getHeight(null));
   
    this.jf.setUndecorated(true);
   
    this.origin = new Point();
   
    AWTUtilities.setWindowShape(this.jf, getImageShape(this.img));
   
    this.jf.setLocationRelativeTo(null);
  }
 
  public void addDragLisener()
  {
    this.jf.addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        createShape.this.origin.x = e.getX();
        createShape.this.origin.y = e.getY();
      }
     
      public void mouseClicked(MouseEvent e)
      {
        if (e.getButton() == 3) {
          System.exit(0);
        }
      }
     
      public void mouseReleased(MouseEvent e)
      {
        super.mouseReleased(e);
      }
     
      public void mouseEntered(MouseEvent e)
      {
        createShape.this.jf.repaint();
      }
    });
    this.jf.addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseDragged(MouseEvent e)
      {
        Point p = createShape.this.jf.getLocation();
        createShape.this.jf.setLocation(p.x + e.getX() - createShape.this.origin.x, p.y + e.getY() - createShape.this.origin.y);
      }
    });
  }
 
  public Shape getImageShape(Image img)
  {
    ArrayList<Integer> x = new ArrayList();
    ArrayList<Integer> y = new ArrayList();
    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++)
    {
      int alpha = getAlpha(pixels[i]);
      if (alpha != 0)
      {
        x.add(Integer.valueOf(i % width > 0 ? i % width - 1 : 0));
        y.add(Integer.valueOf(i % width == 0 ? i / width - 1 : i == 0 ? 0 : 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;
      }
    }
    for (int c = 0; c < x.size(); c++) {
      matrix[((Integer)y.get(c)).intValue()][((Integer)x.get(c)).intValue()] = 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;
  }
}

时间: 2024-08-11 01:08:46

Java 创建不规则窗口的相关文章

Duiib 创建不规则窗口(转载)

方法一: 转载:http://blog.csdn.net/chenlycly/article/details/46447297 转载:http://blog.csdn.net/harvic880925/article/details/8925650 方法二: 转载:http://blog.csdn.net/xdrt81y/article/details/22063479

C#创建不规则窗体的3种方式详解

现在,C#创建不规则窗体不是一件难事,下面总结一下: 一.自定义窗体 一般为规则的图形,如圆.椭圆等. 做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下: System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath(); shape.AddEllipse(0,0,this.Height, this.Width); this.Region = ne

MFC小程序—————02 不规则窗口小应用程序

什么不说了,先上程序截图: 运行结果是有一棵有星星在闪烁的圣诞树,还会循环播放背景音乐. 之前也是在网上看到类似的一个程序,然后自己最近也在学MFC,所以就模仿着写了一个, 其中使用的是GDI+来显示.png透明背景的图片,图片是在网上找的一张,然后又用PS把其中发光的星星给去掉了,做了一张不带发光星星的 .png图片,然后在程序中使用一个定时器来定时刷新窗口背景,使用这两张图片交替变换,实现星星闪烁的动画效果,利用MCI来播放.mp3的 背景音乐(如果想更改背景音乐,请先删除res文件夹下的s

Windows SDK 实现不规则窗口介绍

不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的项目名为RgnWindow. View Row Code 1 // RgnWindow.cpp : Defines the entry point for the application. 2 // 3   4 #include "stdafx.h" 5 #include "Rg

java创建多线程(转载)

转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //

Java中的窗口应用程序的设计

1.创建一个窗口程序(JFrame),标题栏起名为"浏览器",有一个菜单条,有"文件"."编辑"."查看"3个菜单."文件"菜单有两个菜单项,一项是"打开",一项是"保存","打开"项做成子菜单,有两个菜单项"打开x"和"打开y","保存"项就是普通的菜单项."编辑"菜

Java创建Timestamp的几种方式

1.java创建Timestamp的几种方式 Timestamp time1 = new Timestamp(System.currentTimeMillis()); Timestamp time2 = new Timestamp(new Date().getTime()); Timestamp time3 = new Timestamp(Calendar.getInstance().getTimeInMillis()); //不建议使用 Timestamp time4 = new Timest

使用jQuery创建模态窗口登陆效果

来源:GBin1.com 在线下载 在线演示 隐藏模态窗口技术是一种很好的解决方案,用于处理不是特有必要出现在网页上的界面元素.社交网络可以使用模态窗口传达私人讯息以及只针对会员才能看 到的表单.在博客和杂志网站也适用于与主网站分开的作者登陆页面,模态窗口比在JavaScript中创建新窗口更容易,因为使用HTML标记显示,所有 的东西能都呈现在同一个窗口中. 我将演示如何利用jQuery插件leanModal建立一个常规模态窗口.如果你有MIT general license,那么这个插件是完