头几天在这论坛上看见的一个程序,今天玩了下,看见有点小BUG,改了下,拿出来给原作者点评
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.*;@SuppressWarnings("serial")
public class GetScreen extends Frame
{
private static PanelImage panelImage;
private static Graphics g;
//记录屏幕.size()
private static Dimension screenDims;
//用于设置全屏
private GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
//矩形的平面坐标和宽高,
private static int x,y,w,h; public static void main(String args[])
{
GetScreen getScreen=new GetScreen();
//关闭窗口时退出程序
getScreen.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public GetScreen()
{
add(getPanelImage());
// 去掉窗口的边框
this.setUndecorated(true);
// 设置全屏
gd.setFullScreenWindow(this);
// 窗体始终靠前
this.setAlwaysOnTop(true);
setVisible(true);
} public JComponent getPanelImage()
{
panelImage=new PanelImage(getScreenImage());
//设置监听
panelImage.addMouseListener(new MouseAdapter()
{
//鼠标抬起:截取图片->存入剪切板->退出程序
public void mouseReleased(MouseEvent e)
{
setClipboardImage(panelImage.getImg(x, y, w, h));
JOptionPane.showMessageDialog(null,"已经复制到剪切板");
System.exit(0);
}
//mouse按下:记录矩阵的起点坐标
public void mousePressed(MouseEvent e)
{
x=e.getX();
y=e.getY();
}
});
panelImage.addMouseMotionListener(new MouseAdapter()
{
//鼠标拖动:重新显示图片->画矩形->记录图片的宽高
public void mouseDragged(MouseEvent e)
{
g=panelImage.getGraphics();
panelImage.paintComponent(g); g.setColor(Color.black);
g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
g.dispose(); w=e.getX()-x;
h=e.getY()-y;
}
});
return panelImage;
}
/**
* 获取屏幕画面
* @return BufferedImage
*/
private static BufferedImage getScreenImage()
{
Robot robot;
try
{
robot = new Robot();
}
catch (Exception e)
{
throw new RuntimeException("unable to construct Robot");
}
// 获取屏幕尺寸
screenDims = Toolkit.getDefaultToolkit().getScreenSize();
// 获取屏幕画面
BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
screenDims.width, screenDims.height));
return screen;
}
/**
* 把图片存入剪切板
* @param image 要存入的图片
*/
private static void setClipboardImage(final BufferedImage image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{ DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}
};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,null);
}
}
@SuppressWarnings("serial")
class PanelImage extends JPanel
{
private BufferedImage img;
public PanelImage(BufferedImage img)
{
this.img=img;
}
/**
* 截取子图片;
* @param x 子图片的 x 坐标;
* @param y 子图片的 y 坐标;
* @param w 子图片的宽,为负值时表示鼠标向起点的左边拖动;
* @param h 子图片的高,为负值时表示鼠标向起点的上方拖动
* @return BufferedImage
*/
public BufferedImage getImg(int x,int y,int w,int h)
{
//跟据w h的正负,判断子图的起点与宽高
if(w>0&&h>0)
{
return img.getSubimage(x, y, w, h);
}
else
{
if(w>0&&h<0)
{
return img.getSubimage(x, y+h, w, -h);
}
else
{
if(w<0&&h>0)
{
return img.getSubimage(x+w, y, -w, h);
}
else
{
return img.getSubimage(x+w, y+h, -w, -h);
}
}
}
}
@Override
public void paintComponent(Graphics g)
{
g.drawImage(img,0,0,null);
}
}
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.*;@SuppressWarnings("serial")
public class GetScreen extends Frame
{
private static PanelImage panelImage;
private static Graphics g;
//记录屏幕.size()
private static Dimension screenDims;
//用于设置全屏
private GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
//矩形的平面坐标和宽高,
private static int x,y,w,h; public static void main(String args[])
{
GetScreen getScreen=new GetScreen();
//关闭窗口时退出程序
getScreen.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public GetScreen()
{
add(getPanelImage());
// 去掉窗口的边框
this.setUndecorated(true);
// 设置全屏
gd.setFullScreenWindow(this);
// 窗体始终靠前
this.setAlwaysOnTop(true);
setVisible(true);
} public JComponent getPanelImage()
{
panelImage=new PanelImage(getScreenImage());
//设置监听
panelImage.addMouseListener(new MouseAdapter()
{
//鼠标抬起:截取图片->存入剪切板->退出程序
public void mouseReleased(MouseEvent e)
{
setClipboardImage(panelImage.getImg(x, y, w, h));
JOptionPane.showMessageDialog(null,"已经复制到剪切板");
System.exit(0);
}
//mouse按下:记录矩阵的起点坐标
public void mousePressed(MouseEvent e)
{
x=e.getX();
y=e.getY();
}
});
panelImage.addMouseMotionListener(new MouseAdapter()
{
//鼠标拖动:重新显示图片->画矩形->记录图片的宽高
public void mouseDragged(MouseEvent e)
{
g=panelImage.getGraphics();
panelImage.paintComponent(g); g.setColor(Color.black);
g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
g.dispose(); w=e.getX()-x;
h=e.getY()-y;
}
});
return panelImage;
}
/**
* 获取屏幕画面
* @return BufferedImage
*/
private static BufferedImage getScreenImage()
{
Robot robot;
try
{
robot = new Robot();
}
catch (Exception e)
{
throw new RuntimeException("unable to construct Robot");
}
// 获取屏幕尺寸
screenDims = Toolkit.getDefaultToolkit().getScreenSize();
// 获取屏幕画面
BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
screenDims.width, screenDims.height));
return screen;
}
/**
* 把图片存入剪切板
* @param image 要存入的图片
*/
private static void setClipboardImage(final BufferedImage image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{ DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}
};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,null);
}
}
@SuppressWarnings("serial")
class PanelImage extends JPanel
{
private BufferedImage img;
public PanelImage(BufferedImage img)
{
this.img=img;
}
/**
* 截取子图片;
* @param x 子图片的 x 坐标;
* @param y 子图片的 y 坐标;
* @param w 子图片的宽,为负值时表示鼠标向起点的左边拖动;
* @param h 子图片的高,为负值时表示鼠标向起点的上方拖动
* @return BufferedImage
*/
public BufferedImage getImg(int x,int y,int w,int h)
{
//跟据w h的正负,判断子图的起点与宽高
if(w>0&&h>0)
{
return img.getSubimage(x, y, w, h);
}
else
{
if(w>0&&h<0)
{
return img.getSubimage(x, y+h, w, -h);
}
else
{
if(w<0&&h>0)
{
return img.getSubimage(x+w, y, -w, h);
}
else
{
return img.getSubimage(x+w, y+h, -w, -h);
}
}
}
}
@Override
public void paintComponent(Graphics g)
{
g.drawImage(img,0,0,null);
}
}
解决方案 »
- 关于java.beans.EventHandler方法的疑问
- 为什么创建无法连接到ServerSocket的Socket会让程序死掉?
- 帮我看一看下面的算法是不是有问题的
- JTable,如何设置JTable的Header阴刻浮雕化显示?
- DES加密问题
- 请问哪里有现成的java模块 可下载啊
- 请问,大家怎么限制 JTextField中只可以输入4个字符.注意是只可以输入4个,不是显示4个。
- thinking in java中的小疑问,快答快结贴!!
- 请教JAVA怎样实现多继承问题?
- 关于WebSphere和WebLogic
- 请问java的子类如何重载父类的方法?
- 类似qq多人间一对一聊天,服务器应该怎么设置
http://topic.csdn.net/u/20090804/21/be07e6cb-250c-4e42-9c7b-824897a894a5.html