请教关于绘制不规则窗体的问题

放松放松啊 2013-06-28 02:58:20
自己写了一段代码,关于绘图的。现在要实现将绘出的图直接显示在桌面上,得知可以通过绘制不规则窗体实现。找了一个绘制不规则窗体的代码,但是不会把两段结合到一起。大神帮看下。
第一个,自己写的绘图代码:
package back;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.MouseEvent;







import javax.swing.JFrame;
import javax.swing.JPanel;

public class YY {

private JFrame frame;

/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
YY window = new YY();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application
*/
public YY() {
createContents();
}

/**
* Initialize the contents of the frame
*/
private void createContents() {
frame = new JFrame();
frame.setBounds(200, 50, 1000, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MousePanel());
}
class MousePanel extends JPanel implements java.awt.event.MouseMotionListener
{
int x;
int y;
int n;
int p;
public MousePanel()
{
this.addMouseMotionListener(this);
}
/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println(e.getX()+"\t"+e.getY());
Point point = MouseInfo.getPointerInfo().getLocation();
x=(int) point.getX();
y=(int) point.getY();
x=x-frame.getX()-7;
y=y-frame.getY()-30;
if(x>474){
n=429-((429-y)*290)/(x-474);
p=474+290-(290*n)/(429-n);
}
if(x<474){
n=429-((429-y)*290)/(474-x);
p=(290*n)/(429-n)+139;
}
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.RED);
g.drawRect(0,0, 948, 622);
g.drawOval(456,411, 36,36);
if(n<334){
if(x>474){
g.drawLine(474,429,474+290,n);
g.drawLine(474+290,n,p,0);
}
if(x<474){
g.drawLine(474,429,474-290,n+5);
g.drawLine(474-290,n+5,p+58,0);
}
}
repaint();
}

}

}


第二个,绘制不规则窗体的代码:
package back;
import java.awt.Graphics;
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;
import com.sun.awt.AWTUtilities;
/**
* 不规则窗体示例
* @author Hexen
*/
public class IrregularFormSample extends JFrame {
private static final long serialVersionUID = 1L;
private Point origin; //用于移动窗体
private Image img; //用来设定窗体不规则样式的图片
public IrregularFormSample() {
super();

/* 首先初始化一张图片,我们可以选择一张有透明部分的不规则图片
* (当然我们要选择支持Alpha(透明)层的图片格式,如PNG),这张
* 图片将被用来生成与其形状相同的不规则窗体
*/
MediaTracker mt=new MediaTracker(this);
img=Toolkit.getDefaultToolkit().createImage("12.png");
mt.addImage(img, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}

try {
initialize();//窗体初始化
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 窗体初始化
* @throws IOException
*/
private void initialize() throws IOException {
//设定窗体大小和图片一样大
this.setSize(img.getWidth(null), img.getHeight(null));
//设定禁用窗体装饰,这样就取消了默认的窗体结构
this.setUndecorated(true);
//初始化用于移动窗体的原点
this.origin=new Point();

//调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
AWTUtilities.setWindowShape(this,getImageShape(img));
//设定窗体可见度
AWTUtilities.setWindowOpacity(this, 0.8f);

this.setLocationRelativeTo(null);

//由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法
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);
}
@Override
public void mouseEntered(MouseEvent e) {
repaint();
}
}
);
addMouseMotionListener(
new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
Point p = getLocation();
setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y );
}
}
);
}

/**
* 将Image图像转换为Shape图形
0 * @param img
* @param isFiltrate
* @return Image图像的Shape图形表示
* @author Hexen
*/
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);
}
}

//建立图像矩阵并初始化(0为透明,1为不透明)
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类所表示区域可以进行合并,我们逐一水平"扫描"图像矩阵的每一行,
* 将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec
* 对象进行合并,最后形成一个完整的Shape图形
*/
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;
}

/**
* 获取像素的Alpha值
* @param pixel
* @return 像素的Alpha值
*/
private int getAlpha(int pixel) {
return (pixel >> 24) & 0xff;
}


/* 我们可以选择在窗体上绘制图片,是窗体完全呈现出图片的样式,
* 当然我们也可以根据需要不绘制它,而采取其他操作
*/
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(img, 0, 0, null);
}

public static void main(String[] args) {
IrregularFormSample sample = new IrregularFormSample();
sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sample.setVisible(true);
}
}
...全文
90 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
放松放松啊 2013-06-28
  • 打赏
  • 举报
回复
引用 1 楼 a1006570862 的回复:
问下楼主问题:怎么导入com.sun.awt.AWTUtilities ?
比较新的jak直接用就好了
地下室森林 2013-06-28
  • 打赏
  • 举报
回复
问下楼主问题:怎么导入com.sun.awt.AWTUtilities ?
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 DELL服务器的操作系统部署流程包含一系列细致的环节,其适用范围涵盖多种操作系统类型,例如Windows Server与Red Hat Linux等。在启动部署之前,必须确认服务器的光驱设备为DVD驱动器,并且需准备对应的系统安装媒介。下面将详细列出完整的部署步骤: 1. **启动准备**:将随服务器提供的Systems Management Tools and Documentation version 6.0光盘置入服务器光驱,随后设定服务器以光驱作为启动设备。此环节旨在确保服务器在启动阶段能够读取安装光盘内容。 2. **语言设定**:服务器启动后,选定简体中文作为部署语言,并确认接受许可协议条款。 3. **时区选择**:在部署期间,需设定时区为北京、香港、重庆或乌鲁木齐,依据实际地理位置进行适配选择。 4. **系统类型选择**:随后,需选定计划部署的操作系统,支持的版本包括Server 2003 SP2、Server 2003 SP2 64位版本、Windows 2003 SBS SP2、Server 2008、Windows 2008 SBS/EBS x64版本等,以及多种Red Hat和SUSE Linux版本。 5. **RAID设定**:若服务器出厂时已预设RAID配置,则可选择跳过此步骤。若需重新设定RAID,操作时需格外小心,因为这一过程可能引发硬盘数据遗失。 6. **引导分区规划**:设定引导分区的大小,通常C盘建议预留至少20GB的空间,具体容量需根据系统需求进行调整。 7. **网络设定**:网络设定可在系统部署完成后执行,部署期间建议暂时拔除...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧