package org.vv.game.frame; |
|
import java.awt.AWTException; |
import java.awt.Color; |
import java.awt.Font; |
import java.awt.Graphics; |
import java.awt.Rectangle; |
import java.awt.Robot; |
import java.awt.Toolkit; |
import java.awt.event.ComponentEvent; |
import java.awt.event.ComponentListener; |
import java.awt.event.KeyEvent; |
import java.awt.event.KeyListener; |
import java.awt.event.MouseEvent; |
import java.awt.event.MouseListener; |
import java.awt.event.MouseMotionListener; |
import java.awt.image.BufferedImage; |
import java.io.File; |
import java.io.FileInputStream; |
import java.io.FileNotFoundException; |
import java.io.IOException; |
import java.io.InputStream; |
|
import javax.imageio.ImageIO; |
import javax.swing.JFileChooser; |
import javax.swing.JFrame; |
import javax.swing.JOptionPane; |
|
import org.vv.game.util.ExampleFileFilter; |
import org.vv.game.util.ImageSelector; |
import org.vv.game.util.ImageUtil; |
import org.vv.game.vo.ImageSegment; |
|
/** |
* @author 俞立全 E-mail:vv_2048@163.com |
* @version 创建时间:Feb 21, 2010 9:21:09 PM |
* 类说明 拼图游戏 |
*/ |
@SuppressWarnings ( "serial" ) |
public class NineImageFrame extends JFrame implements MouseListener,MouseMotionListener,KeyListener,ComponentListener, Runnable { |
|
// 取得屏幕的宽度 |
int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; |
// 取得屏幕的高度 |
int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; |
// 游戏网格设置 |
// 设置分割数量 2,3,4,5,6 |
int size = 3 ; |
// 上边距 |
int top = 35 ; |
// 左边距 |
int left = 13 ; |
// 右边距 |
int right = 220 ; |
// 下边距 |
int bottom = 13 ; |
|
// 窗体可变参数,窗体放缩比例 |
int wSize = 400 ; |
// 窗体的高度 |
int height = top + bottom + wSize; //400 |
// 窗体的宽度 |
int width = left + right + wSize; //510 |
//游戏区域 |
int wLength = width - left - right; |
int hLength = height - top - bottom; |
// 方格的长宽 |
int xLength = wLength / size; |
int yLength = hLength / size; |
|
// 背景图片 |
BufferedImage bgImage = null ; |
|
private final int smallImageWidth = 200 ; |
private final int smallImageHeight = 200 ; |
// 缩略图片 |
BufferedImage smallImage; |
// 保持拼图板的位置 |
ImageSegment[][] allImages = new ImageSegment[size][size]; |
BufferedImage[][] allImagesCopy = new BufferedImage[size][size]; |
// 保存正确图版的位置 |
ImageSegment[][] allImagesTmp = new ImageSegment[size][size]; |
// 保存最多拥有多少时间(秒) |
int maxTime = 60 ; |
// 做倒计时的线程类 |
Thread t = new Thread( this ); |
// 保存剩余时间 |
int remainingTime = 30 ; |
// 提示 |
String gameMessage = " 无限制" ; |
// 图片数量 |
int bkNum = 11 ; |
// 游戏是否停止 |
boolean canPlay = true ; |
// 空白数字设置最后一块 |
int blankNum = size * size - 1 ; |
// 空白块的数组编号 |
int blankImageX = 0 ; |
int blankImageY = 0 ; |
// 预设字体 |
Font f1 = new Font( "黑体" , Font.BOLD, 40 ); |
|
//默认包中的图片 |
private String imagePackage = "/image/def/" ; |
//保存选择的图片路径 |
private String selFilePath = null ; |
//判断选择图片还是目录 |
private boolean isDir = false ; |
//private String selDirPath = null; |
//缩略图放大镜方块 |
private int magnifierX = 20 ; |
private int magnifierY = 20 ; |
private int magnifierWidth= 200 ; //smallImageWidth/2; |
private int magnifierHeight = 200 ; //smallImageHeight/2; |
private BufferedImage magnifierBufferedImage; |
private boolean showMagnifier = false ; |
|
// Font f2 = new Font("黑体", Font.BOLD, 80); |
|
//private ImageIcon gifImage; |
|
//三个按钮 |
private BufferedImage[] btnImage = new BufferedImage[ 3 ]; |
|
|
public NineImageFrame() { |
initialize(); |
} |
|
public void initialize(){ |
// 设置标题 |
this .setTitle( "拼图 vv_2048@163.com" ); |
// 设置窗体大小 |
this .setSize(width, height); |
// 设置窗体出现位置 居中显示 |
this .setLocation((screenWidth - width) / 2 , |
(screenHeight - height) / 2 ); |
// 将窗体设置为大小可改变 |
//this.setResizable(true); |
// 将窗体的关闭方式设置为默认关闭后程序结束 |
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
// 为窗体加入鼠标监听器 |
this .addMouseListener( this ); |
// 为窗体加入鼠标监听器 |
this .addMouseMotionListener( this ); |
// 为窗体加入键盘监听器 |
this .addKeyListener( this ); |
//添加 ComponentListener |
this .addComponentListener( this ); |
|
// 加载背景图片 |
//String imagePath = ""; |
try { |
|
bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage( this .getClass(), "/image/background/" , 12 , "" , "gif" )); |
//按钮背景 |
btnImage[ 0 ] = ImageIO.read(getClass().getResource( "/image/btn1.png" )); |
btnImage[ 1 ] = ImageIO.read(getClass().getResource( "/image/btn2.png" )); |
btnImage[ 2 ] = ImageIO.read(getClass().getResource( "/image/btn3.png" )); |
|
} catch (IOException e) { |
e.printStackTrace(); |
} |
|
// 加载鼠标光标 |
/* |
* Toolkit tk=Toolkit.getDefaultToolkit(); Image img=new |
* ImageIcon(getClass().getResource("/image/point.jpg")).getImage(); |
* mouse.gif是你的图标 Cursor cu=tk.createCustomCursor(img,new |
* Point(10,10),"stick"); this.setCursor(cu); |
*/ |
|
try { |
//随机图片 |
InputStream is = ImageSelector.getInstance().getRandomJarImage( this .getClass(),imagePackage,bkNum, "bk" , "jpg" ); |
// 初始化数据 |
this .initData(is); |
is.close(); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
|
//gif动画 |
//gifImage = new ImageIcon(getClass().getResource("/image/121212.gif")); |
|
// 将窗体显示出来 |
this .setVisible( true ); |
|
// 刷新屏幕,防止开始游戏时出现无法显示的情况. |
// this.repaint(); |
} |
|
|
|
public void paint(Graphics g) { |
|
height = this .getHeight(); |
width = this .getWidth(); |
|
xLength = (width - left - right) / size; |
yLength = (height - top - bottom) / size; |
|
// 双缓冲技术防止屏幕闪烁 |
BufferedImage bi = new BufferedImage(width, height, |
BufferedImage.TYPE_INT_RGB); |
Graphics g2 = bi.createGraphics(); |
g2.setColor(Color.BLACK); |
// 绘制背景 |
if (bgImage != null ) { |
int imageWidth = bgImage.getWidth( this ); |
int imageHeight = bgImage.getHeight( this ); |
// 背景图片平铺 |
for ( int ix = 0 ; ix < width; ix += imageWidth) { |
for ( int iy = 0 ; iy < height; iy += imageHeight) { |
g2.drawImage(bgImage, ix, iy, this ); |
} |
} |
// System.out.println("image"); |
} |
// 输出标题信息 |
// g2.setFont(new Font("黑体", Font.BOLD, 12)); |
// g2.drawString("游戏信息:", 130, 60); |
|
// 绘制拼图图片 |
// g2.drawImage(segmentImage, left, top,200,100,100,100,200,200,this); |
|
// 绘制缩略图 |
g2.drawImage(smallImage, width - left - right + 20 , top,smallImageWidth,smallImageHeight, this ); |
g2.drawRect(width - left - right + 20 , top, smallImageWidth, smallImageHeight); |
|
// 绘制数据 |
|
//g2.setFont(f1); |
// 获取字符串的高度和宽度 |
//FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(f1); |
//int fh = fm.getHeight(); |
|
for ( int i = 0 ; i < allImages.length; i++) { |
for ( int j = 0 ; j < allImages.length; j++) { |
allImagesCopy[i][j]= ImageUtil.resize(allImages[i][j].getImage(), xLength, yLength, false ); |
if (allImages[i][j].isShow()){ |
g2.drawImage(allImagesCopy[i][j], i * xLength + left, j * yLength + top, this ); |
} |
/*int fw = fm.stringWidth(String.valueOf(allImages[i][j].getId())); |
g2.drawString(String.valueOf(allImages[i][j].getId()), i * |
xLength + xLength / 2 + left - fw / 2, j * yLength + top + |
yLength / 2 + fh / 2 - 10);*/ |
} |
} |
//重新开始按键区域 |
g2.drawRect(width - left - right + 20 , top+smallImageHeight+ 10 , smallImageWidth, 40 ); |
//选择图片按键区域 |
g2.drawRect(width - left - right + 20 , top+smallImageHeight+ 60 , smallImageWidth, 40 ); |
// 刷新 |
g2.drawRect(width - left - right + 20 , top+smallImageHeight+ 110 , smallImageWidth, 40 ); |
// 绘制按钮 |
g2.drawImage( this .btnImage[ 0 ],width - left - right + 20 ,top+smallImageHeight+ 10 , this ); |
g2.drawImage( this .btnImage[ 1 ],width - left - right + 20 ,top+smallImageHeight+ 60 , this ); |
g2.drawImage( this .btnImage[ 2 ],width - left - right + 20 ,top+smallImageHeight+ 110 , this ); |
// 在标题中显示剩余时间 |
this .setTitle( "拼图 " + gameMessage); |
|
//绘制放大镜 |
int wLength = width - left - right; |
int hLength = height - top - bottom; |
if ( this .showMagnifier){ |
g2.drawRect( this .magnifierX, this .magnifierY, this .magnifierWidth, this .magnifierHeight); |
g2.drawImage( this .magnifierBufferedImage, left, top,wLength,hLength, this ); |
} |
// 绘制网格 |
|
for ( int i = 0 ; i <= size; i++) { |
g2.drawLine(left, top + yLength*i, width - right- 1 , top + yLength*i); |
g2.drawLine(left + xLength * i,top, left + xLength * i, height - bottom- 1 ); |
} |
|
//gif 动画测试 |
/*try { |
g2.drawImage(ImageIO.read(getClass().getResource("/image/121212.gif")),50,50,200,200,this); |
} catch (FileNotFoundException e) { |
e.printStackTrace(); |
} catch (IOException e) { |
e.printStackTrace(); |
}*/ |
//g2.drawImage(gifImage.getImage(), 50,50, 200,200,this); |
|
|
g.drawImage(bi, 0 , 0 , this ); |
} |
|
|
public void mouseClicked(MouseEvent e) { |
//鼠标双击 |
if (e.getClickCount()== 2 ){ |
|
} |
//检测鼠标右键单击 |
if (e.isMetaDown()){ |
|
} |
} |
|
public void mouseEntered(MouseEvent e) { |
//System.out.println(e.getX()); |
} |
|
public void mouseExited(MouseEvent e) { |
|
} |
|
@SuppressWarnings ( "deprecation" ) |
public void mousePressed(MouseEvent e) { |
if (canPlay && e.getX() >= left && e.getX() <= width-right && e.getY() >= top |
&& e.getY() <= height) { |
// 获取窗格相对坐标 |
int x = e.getX() - left; |
int y = e.getY() - top; |
// 计算数组序列 |
int ptX = x / xLength; |
int ptY = y / yLength; |
// 判断上下左右四个方向是否存在空砖块,假设9为空白。 |
ImageSegment tmp; |
|
if (allImages[ptX][ptY].getId() != blankNum) { |
// 上 |
if (y - yLength > 0 |
&& allImages[ptX][ptY - 1 ].getId() == blankNum) { |
tmp = allImages[ptX][ptY]; |
allImages[ptX][ptY] = allImages[ptX][ptY - 1 ]; |
allImages[ptX][ptY - 1 ] = tmp; |
// 保存空白块的位置 |
blankImageY = blankImageY + 1 ; |
} |
// 下 |
else if (yLength * size - y > yLength |
&& allImages[ptX][ptY + 1 ].getId() == blankNum) { |
tmp = allImages[ptX][ptY]; |
allImages[ptX][ptY] = allImages[ptX][ptY + 1 ]; |
allImages[ptX][ptY + 1 ] = tmp; |
blankImageY = blankImageY - 1 ; |
} |
// 左 |
else if (x - xLength > 0 |
&& allImages[ptX - 1 ][ptY].getId() == blankNum) { |
tmp = allImages[ptX][ptY]; |
allImages[ptX][ptY] = allImages[ptX - 1 ][ptY]; |
allImages[ptX - 1 ][ptY] = tmp; |
blankImageX = blankImageX + 1 ; |
} |
// 右 |
else if (xLength * size - x > xLength |
&& allImages[ptX + 1 ][ptY].getId() == blankNum) { |
tmp = allImages[ptX][ptY]; |
allImages[ptX][ptY] = allImages[ptX + 1 ][ptY]; |
allImages[ptX + 1 ][ptY] = tmp; |
blankImageX = blankImageX - 1 ; |
} |
// System.out.println(blankImageX + " : " + blankImageY); |
} |
|
// System.out.println(x + ":" + y +" "+ptX+" - "+ptY |
// +" "+allImages[ptX][ptY]); |
// JOptionPane.showMessageDialog(this, x + ":" + y |
// +" "+ptX+" - "+ptY +" "+allImages[ptX][ptY]); |
this .repaint(); |
this .verify(); |
} |
|
int x1 = width - left - right + 20 ; |
int y1 = top+smallImageHeight; |
int x2 = x1 + smallImageWidth; |
int y2 = y1 + 40 ; |
|
if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 10 && e.getY() < y2 + 10 ) { |
int result = JOptionPane.showConfirmDialog( this , "是否重新开始游戏?" ); |
if (result == 0 ) { |
//随机图片 |
|
/*int num = this.getRandomNumber(bkNum) + 1; |
InputStream is = NineImageFrame.class.getResourceAsStream("/image/" |
+ "bk" + num + ".jpg");*/ |
InputStream is; |
try { |
//随机背景 |
bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage( this .getClass(), "/image/background/" , 12 , "" , "gif" )); |
is = ImageSelector.getInstance().getRandomJarImage( this .getClass(),imagePackage,bkNum, "bk" , "jpg" ); |
this .initData(is); |
is.close(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
|
remainingTime = maxTime; |
this .canPlay = true ; |
this .repaint(); |
t.resume(); |
} |
} |
|
//自选图像 |
if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 60 && e.getY() < y2 + 60 ) { |
JFileChooser jf = new JFileChooser( "Title..." ); |
jf.setDialogTitle( "请选择图像文件..." ); |
jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); |
ExampleFileFilter filter = new ExampleFileFilter(); |
filter.addExtension( "jpg" ); |
filter.addExtension( "gif" ); |
filter.addExtension( "png" ); |
filter.setDescription( "JPG & GIF & PNG Images" ); |
jf.setFileFilter(filter); |
if (selFilePath == null || "" .equals(selFilePath)){ |
jf.setCurrentDirectory( new File( "." )); //设置当前目录 |
} else { |
jf.setCurrentDirectory( new File(selFilePath)); //设置之前选择的目录 |
} |
int result = jf.showOpenDialog( this ); |
jf.setVisible( true ); |
File selectedFile = null ; |
if (result == JFileChooser.APPROVE_OPTION) { |
selectedFile = jf.getSelectedFile(); |
if (selectedFile.exists()) { |
//随机背景 |
try { |
bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage( this .getClass(), "/image/background/" , 12 , "" , "gif" )); |
} catch (FileNotFoundException e2) { |
e2.printStackTrace(); |
} catch (IOException e2) { |
e2.printStackTrace(); |
} |
if (selectedFile.isDirectory()){ |
try { |
selFilePath = selectedFile.getAbsolutePath(); |
InputStream is = ImageSelector.getInstance().getRandomImage(selectedFile); |
this .initData(is); |
is.close(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
isDir = true ; |
} |
if (selectedFile.isFile()){ |
try { |
selFilePath = selectedFile.getAbsolutePath(); |
InputStream is = new FileInputStream(selectedFile); |
this .initData(is); |
is.close(); |
} catch (FileNotFoundException e1) { |
e1.printStackTrace(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
isDir = false ; |
} |
remainingTime = maxTime; |
this .canPlay = true ; |
this .repaint(); |
t.resume(); |
} else { |
System.out.println( "No! You did not select the right file." ); |
} |
} else if (result == JFileChooser.CANCEL_OPTION) { |
System.out.println( "Cancel button is pushed." ); |
} else if (result == JFileChooser.ERROR_OPTION) { |
System.err.println( "Error when select file." ); |
} |
} |
|
// 刷新 |
if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 110 && e.getY() < y2 + 110 ) { |
if (isDir){ |
InputStream is = null ; |
if (selFilePath!= null && ! "" .equals(selFilePath)){ |
int result = JOptionPane.showConfirmDialog( this , "是否更更换拼图?" ); |
if (result == 0 ) { |
try { |
//随机背景 |
bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage( this .getClass(), "/image/background/" , 12 , "" , "gif" )); |
is = ImageSelector.getInstance().getRandomImage( new File(selFilePath)); |
this .initData(is); |
is.close(); |
remainingTime = maxTime; |
this .canPlay = true ; |
this .repaint(); |
t.resume(); |
} catch (FileNotFoundException e1) { |
e1.printStackTrace(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
} |
|
} |
else { |
JOptionPane.showMessageDialog( this , "请先选择自定义图片目录" ); |
} |
} else { |
JOptionPane.showMessageDialog( this , "请先选择自定义图片目录" ); |
} |
|
|
} |
|
} |
|
|
public void mouseReleased(MouseEvent e) { |
if ( this .showMagnifier){ |
this .showMagnifier = false ; |
repaint(); |
} |
} |
|
/** |
* 初始化拼图数组序列 |
*/ |
public void initData(InputStream is) { |
remainingTime = maxTime; |
BufferedImage[] bis = cutImage(is, size); |
|
int a = 0 ; |
for ( int i = 0 ; i < allImages.length; i++) { |
for ( int j = 0 ; j < allImages.length; j++) { |
allImagesTmp[j][i] = new ImageSegment(); |
allImagesTmp[j][i].setId(a++); |
} |
} |
|
// 产生随机序列 |
// i/y 基数递增函数 |
// i%y 0-y范围循环 |
int [] rand = ImageSelector.getInstance().getRandoms(size * size); |
for ( int i = 0 ; i < rand.length; i++) { |
allImages[i / size][i % size] = new ImageSegment(); |
allImages[i / size][i % size].setId(rand[i] - 1 ); |
// getRandoms 生成的随机数是从1开始的,所有 bis[] 需要减一 |
allImages[i / size][i % size].setImage(bis[rand[i] - 1 ]); |
|
// 获取空白的特殊块的信息 |
if (rand[i]- 1 == this .blankNum) { |
blankImageX = i / size; |
blankImageY = i % size; |
allImages[i / size][i % size].setShow( false ); |
} |
} |
} |
|
@SuppressWarnings ( "deprecation" ) |
public void run() { |
// 判断是否有时间限制 |
if (maxTime > 0 ) { |
while ( true ) { |
remainingTime--; |
if (remainingTime == 0 ) { |
this .canPlay = false ; |
JOptionPane.showMessageDialog( this , "超时,游戏结束!" ); |
t.suspend(); |
remainingTime = - 1 ; |
} |
gameMessage = remainingTime / 3600 + ":" |
+ (remainingTime / 60 - remainingTime / 3600 * 60 ) |
+ ":" + (remainingTime - remainingTime / 60 * 60 ); |
this .repaint(); |
if (t.isAlive()) { |
try { |
Thread.sleep( 1000 ); |
} catch (InterruptedException e) { |
e.printStackTrace(); |
} |
} |
// System.out.println(remainingTime); |
} |
} |
} |
|
/** |
* 判断数组拼图是否正确 |
* |
* @return |
*/ |
@SuppressWarnings ( "deprecation" ) |
public void verify() { |
boolean rt = true ; |
for ( int i = 0 ; i < allImagesTmp.length; i++) { |
for ( int j = 0 ; j < allImagesTmp[i].length; j++) { |
if (allImagesTmp[j][i].getId() != allImages[j][i].getId()) { |
rt = false ; |
break ; |
} else { |
rt = true ; |
} |
} |
if (!rt) { |
break ; |
} |
} |
if (rt) { |
this .canPlay = false ; |
allImages[blankImageY][blankImageX].setShow( true ); |
JOptionPane.showMessageDialog( this , "success!" ); |
t.suspend(); |
} |
} |
|
|
|
|
|
/** |
* 把图片分割多少行多少列的 |
* |
* @param imageName |
* @param size |
* @return |
*/ |
public BufferedImage[] cutImage(InputStream is, int size) { |
BufferedImage[] bis = new BufferedImage[size * size]; |
BufferedImage scalesBufferedImage = null ; |
try { |
scalesBufferedImage = ImageUtil.resize(ImageIO.read(is), wLength, hLength, false ); |
// 创建缩略图片 |
smallImage = scalesBufferedImage; |
/*smallImage = ImageUtil.resize(scalesBufferedImage, smallImageWidth, |
smallImageHeight,false);*/ |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
|
BufferedImage bi = null ; |
for ( int i = 0 ; i < size * size; i++) { |
Rectangle rect = new Rectangle((i % size) * xLength, (i / size) |
* yLength , xLength- 1 , yLength); |
//如果图片长700/3,可能出错,xLength-1 |
bi = scalesBufferedImage.getSubimage(rect.x, rect.y, |
rect.width, rect.height); |
bis[i] = bi; |
|
} |
try { |
is.close(); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
return bis; |
} |
|
// 键盘事件 |
@Override |
public void keyPressed(KeyEvent e) { |
ImageSegment tmp; |
switch (e.getKeyCode()) { |
case 37 : |
// 方向键 左 |
if (blankImageX < size - 1 ) { |
tmp = allImages[blankImageX][blankImageY]; |
allImages[blankImageX][blankImageY] = allImages[blankImageX + 1 ][blankImageY]; |
allImages[blankImageX + 1 ][blankImageY] = tmp; |
// 保存空白块位置 |
blankImageX = blankImageX + 1 ; |
// System.out.println(blankImageX + " : " + blankImageY); |
} |
break ; |
case 38 : |
// 方向键 上 |
if (blankImageY < size - 1 ) { |
tmp = allImages[blankImageX][blankImageY]; |
allImages[blankImageX][blankImageY] = allImages[blankImageX][blankImageY + 1 ]; |
allImages[blankImageX][blankImageY + 1 ] = tmp; |
// 保存空白块位置 |
blankImageY = blankImageY + 1 ; |
// System.out.println(blankImageX + " : " + blankImageY); |
} |
break ; |
case 39 : |
// 方向键 右 |
if (blankImageX > 0 ) { |
tmp = allImages[blankImageX][blankImageY]; |
allImages[blankImageX][blankImageY] = allImages[blankImageX - 1 ][blankImageY]; |
allImages[blankImageX - 1 ][blankImageY] = tmp; |
// 保存空白块位置 |
blankImageX = blankImageX - 1 ; |
// System.out.println(blankImageX + " : " + blankImageY); |
} |
break ; |
case 40 : |
// 方向键 下 |
if (blankImageY > 0 ) { |
tmp = allImages[blankImageX][blankImageY]; |
allImages[blankImageX][blankImageY] = allImages[blankImageX][blankImageY - 1 ]; |
allImages[blankImageX][blankImageY - 1 ] = tmp; |
// 保存空白块位置 |
blankImageY = blankImageY - 1 ; |
// System.out.println(blankImageX + " : " + blankImageY); |
} |
break ; |
} |
|
this .repaint(); |
this .verify(); |
|
} |
|
@Override |
public void keyReleased(KeyEvent e) { |
|
} |
|
@Override |
public void keyTyped(KeyEvent e) { |
|
} |
|
|
/** |
* 鼠标拖动 |
*/ |
@Override |
public void mouseDragged(MouseEvent e) { |
int x1 = width - left - right + 20 ; |
int y1 = top; |
int x2 = x1 + smallImageWidth; |
int y2 = y1 + smallImageHeight; |
|
if (e.getX()> x1 && e.getX()< x2 && e.getY()> y1 && e.getY() < y2){ |
this .magnifierX = e.getX()-magnifierWidth/ 2 ; |
this .magnifierY = e.getY()-magnifierHeight/ 2 ; |
Robot robot = null ; |
try { |
robot = new Robot(); |
} catch (AWTException e1) { |
// TODO Auto-generated catch block |
e1.printStackTrace(); |
} |
|
this .magnifierBufferedImage = robot.createScreenCapture( new Rectangle(e.getXOnScreen()-magnifierWidth/ 2 , e.getYOnScreen()-magnifierHeight/ 2 , magnifierWidth, magnifierHeight)); |
/*this.magnifierBufferedImage = this.smallImage.getSubimage(magnifierX, magnifierY, |
magnifierWidth, magnifierHeight);*/ |
this .showMagnifier = true ; |
repaint(); |
} |
|
} |
|
/** |
* 鼠标移动 |
*/ |
@Override |
public void mouseMoved(MouseEvent e) { |
|
|
|
} |
|
@Override |
public void componentHidden(ComponentEvent e) { |
// TODO Auto-generated method stub |
|
} |
|
@Override |
public void componentMoved(ComponentEvent e) { |
// TODO Auto-generated method stub |
|
} |
|
@Override |
public void componentResized(ComponentEvent e) { |
int width = e.getComponent().getWidth(); |
int height = e.getComponent().getHeight(); |
xLength = (width - left - right) / size; |
yLength = (height - top - bottom) / size; |
if (xLength < 120 || yLength < 120 ) { |
// 窗体的高度 |
height = top + bottom + 120 *size; //400 |
// 窗体的宽度 |
width = left + right + 120 *size; //510 |
} |
|
|
setSize(width, height); |
|
} |
|
@Override |
public void componentShown(ComponentEvent e) { |
// TODO Auto-generated method stub |
|
} |
|
} |
初级程序员
by: 雨落冬夜 发表于:2017-04-19 11:32:26 顶(1) | 踩(0) 回复
有源代码下载吗?
回复评论