【Java开源代码栏目提醒】:网学会员为需要Java开源代码的朋友们搜集整理了BoundedImageTest.java相关资料,希望对各位网友有所帮助!
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
class BoundedImage extends Object
{
// 容器的Image和边框
private Image image;
private Rectangle2D bounds;
public BoundedImage(Image img, ImageObserver obs)
{
image = img;
// 把边框位置设为(0,0),宽和高和图像相同
bounds = new Rectangle2D.Double(0, 0,
image.getWidth(obs),
image.getHeight(obs));
}
public Rectangle2D getBounds2D()
{ return bounds;
}
public Image getImage()
{ return image;
}
public AffineTransform getTransform()
{ return AffineTransform.getTranslateInstance(bounds.getX(), bounds.getY());
}
public void moveTo(Point p)
{
bounds.setRect((double)p.x, (double)p.y,
bounds.getWidth(),
bounds.getHeight());
}
} // BoundedImage
public class BoundedImageTest extends Applet implements MouseListener,
MouseMotionListener
{
// 为了方便编辑,对图像文件名做全局引用
private final String FILENAME = "simon.gif";
// 画面所包含的图像数量
private final int NUM_IMAGES = 3;
// BoundedImages 队列
private LinkedList images;
// 当前所选择的 BoundedImage
private BoundedImage pick;
// 高亮显示冲突用的AlphaCompisite
private AlphaComposite alpha;
public void init()
{
images = new LinkedList();
pick = null;
// 在随机位置创建NUM_IMAGES个图像
// 并把它们添加到队列之中
Random r = new Random();
int width = (int)getSize().getWidth();
int height = (int)getSize().getHeight();
// 创建一个 MediaTracker对象,这样我们图像可以先全部加载进来
// 然后再传给BoundedImage类
MediaTracker mt = new MediaTracker(this);
BoundedImage bi; // 要添加到队列中的BoundedImage
Image img; // 一个图像
for(int i = 0; i < NUM_IMAGES; i++)
{
img = getImage(getCodeBase(), FILENAME);
mt.addImage(img, i);
try
{ mt.waitForID(i);
}
catch(InterruptedException e) { /* 什么也不做*/ }
bi = new BoundedImage(img, this);
bi.moveTo(new Point(Math.abs(r.nextInt())%width, Math.abs(r.nextInt())%height));
images.add(bi);
}
// 用40%的透明度创建一个AlphaComposite
alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
// 不要忘记
注册applet来监听鼠标事件
addMouseListener(this);
addMouseMotionListener(this);
}
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
// 绘制图像
BoundedImage bi;
for(int i = 0; i < NUM_IMAGES; i++)
{
bi = (BoundedImage)images.get(i);
g2d.drawImage(bi.getImage(), bi.getTransform(), this);
}
// 如果 pick 指向有效图像,则检测冲突
if(pick != null)
{
for(int i = 0; i < NUM_IMAGES; i++)
{
// 得到队列中的第i个图像
bi = (BoundedImage)images.get(i);
// 检测交叉部分
if(imageCollision(pick, bi))
{
// 填充边界矩形来高亮显示冲突
g2d.setComposite(alpha);
g2d.setPaint(Color.RED.darker());
g2d.fill(bi.getBounds2D());
}
}
// 绘制并填充 pick 矩形
g2d.setPaint(Color.BLUE.brighter());
g2d.setComposite(alpha);
g2d.drawImage(pick.getImage(), pick.getTransform(), this);
g2d.fill(pick.getBounds2D());
}
}
// 检测两个BoundedImages是否交叉(冲突). 这个方法在i1和 i2指向同一个对象时返回false
private boolean imageCollision(BoundedImage i1, BoundedImage i2)
{
return (i1 == i2) ? false :
i1.getBounds2D().intersects(i2.getBounds2D());
}
// 从 MouseListener接口继承来的方法
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e)
{
// 选取一个图像
if(pick == null)
{
BoundedImage bi;
for(int i = 0; i < NUM_IMAGES; i++)
{
bi = (BoundedImage)images.get(i);
// 如果BoundedImage包含鼠标位置,则选取它
if(bi.getBounds2D().contains(e.getPoint()))
{
pick = bi;
return;
}
}
}
}
public void mouseReleased(MouseEvent e)
{
// 释放所选取的图像并重绘画面
pick = null;
repaint();
}
// 从MouseMotionListener接口继承来的方法
public void mouseDragged(MouseEvent e)
{
// 如果我们已经选取了一个图像,则把它的位置设为鼠标位置并重绘
if(pick != null)
{
pick.moveTo(e.getPoint());
repaint();
}
}
public void mouseMoved(MouseEvent e) { }
} // BoundedImageTest