把窗体做成加菲猫形状//求思路

flowerjack 2011-01-17 03:51:06
窗体的形状做成一个特定的形状,例如下图
...全文
990 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
flowerjack 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hebiaccpguo 的回复:]

留个脚印学习了
[/Quote]
有空交流一下
flowerjack 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 only_you104 的回复:]

看到题目觉得比较有意思,网上拷了段代码还原出来的效果:
Java code

package dyna.framework.client.dcmspdm.checkBOM;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import ja……
[/Quote]
感谢你的热心
floger 2011-01-18
  • 打赏
  • 举报
回复
hangmh88 2011-01-17
  • 打赏
  • 举报
回复
有意思
Only_you104 2011-01-17
  • 打赏
  • 举报
回复
看到题目觉得比较有意思,网上拷了段代码还原出来的效果:

package dyna.framework.client.dcmspdm.checkBOM;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
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;

public class ArbitrayShapeWindow extends JFrame {
private static final long serialVersionUID = 1L;
private Point origin; // 用于移动窗体
private Image img; // 用来设定窗体不规则样式的图片

public ArbitrayShapeWindow() {
super();
/*
* 首先初始化一张图片,我们可以选择一张有透明部分的不规则图片 (当然我们要选择支持Alpha(透明)层的图片格式,如PNG),这张
* 图片将被用来生成与其形状相同的不规则窗体
*/
MediaTracker mt = new MediaTracker(this);
img = Toolkit.getDefaultToolkit().createImage("icons/garfield.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图形
*
* @param img
* @param isFiltrate
* @return Image图像的Shape图形表示
* @author Hexen
*/
public Shape getImageShape(Image img) {
ArrayList x = new ArrayList();
ArrayList 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++) {
// 筛选,将不透明的像素的坐标加入到坐标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 < pixels.length; c++) {
matrix[(Integer) y.get(c)][(Integer) 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) {
ArbitrayShapeWindow sample = new ArbitrayShapeWindow();
sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sample.setVisible(true);
}
}
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hw287252422 的回复:]

还有你可以用JAVA3D 做出来
[/Quote]
可以给点JAVA3D的学习材料吗?就是你学的时候觉得比较好的材料
hw287252422 2011-01-17
  • 打赏
  • 举报
回复
还有你可以用JAVA3D 做出来
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 inhibitory 的回复:]

Java code
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

import javax.swing.ImageIcon;
import javax.swing.JFrame……
[/Quote]
很好,研究研究
Inhibitory 2011-01-17
  • 打赏
  • 举报
回复
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

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

import com.sun.awt.AWTUtilities;

/*
创建无规则的窗口: http://www.javaeye.com/topic/707514
在程序中依次设置以下几个参数:
1. 设置窗口完全透明:AWTUtilities.setWindowOpaque(frame, false); // false支持拖动,很关键
2. 设置窗口无边缘:frame.setUndecorated(true);
3. 设置窗口的ContentPane为要显示的Pane:frame.setContentPane(myPane);
在myPane中放置具体要显示的内容,也可以重载paint方法进行Java2D绘制。这些paint会直接发生在桌面背景上。
接下来,就是见证奇迹的时刻!
*/
@SuppressWarnings("restriction")
public class ArbitrayShapeWindow {

@SuppressWarnings({ "serial" })
public static void main(String[] args) {
JPanel panel = new JPanel() {
private Image img = new ImageIcon("resources/shape.png").getImage();

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setPaint(Color.red);
g2d.drawImage(img, 0, 0, img.getWidth(this), img.getHeight(this), null);
}
};

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false);
frame.setContentPane(panel);
//frame.setSize(500, 500); // frame不能用pack()函数
frame.setAlwaysOnTop(true); // 窗口最前面显示
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); // 最大宽度
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hw287252422 的回复:]

透明窗体+背景
[/Quote]
你的方法是设置些属性的呢
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hw287252422 的回复:]

透明窗体+背景
[/Quote]
还有没有更好的方法呢?
hw287252422 2011-01-17
  • 打赏
  • 举报
回复
透明窗体+背景
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
本人长期在线,有思路了立刻结贴
大家给几个建议吧
flowerjack 2011-01-17
  • 打赏
  • 举报
回复
思路,源码,学习材料都可以~~~谢谢大家先

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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