用QQ截图太麻烦。
我只是想要截个图,然后图片保持在窗口最前端即可。
2020.5.17
- 解决从下往上拉动鼠标造成错误的情况
- 增加右击取消截图
import Num.AddNum;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
public class DrawRectTest
{
public static void main(String[] args)
{
new NewFrame();
}
}
class NewFrame extends JFrame
{
private static final long serialVersionUID = 1L;
/* * 创建一个小的窗口。点击按钮来截屏。 */
JButton button;
NewFrame()
{
setVisible(true);
setLayout(new FlowLayout());
setBounds(1000, 600, 200, 100);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button = new JButton("截图");
add(button);
button.addActionListener(new ActionListener()
{
//鼠标点击按钮,new 一个ScreenFrame,设置可见,
public void actionPerformed(ActionEvent e)
{
ScreenFrame sf = new ScreenFrame();
//sf.setAlwaysOnTop(true);
sf.setUndecorated(true);
sf.setVisible(true);
}
});
button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.SHIFT_DOWN_MASK,false), "shift_z");
button.getActionMap().put("shift_z", new AbstractAction() {
/** * */
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
ScreenFrame sf = new ScreenFrame();
sf.setUndecorated(true);
sf.setVisible(true);
}
});
}
}
class ScreenFrame extends JFrame
{
private static final long serialVersionUID = 2L;
/* * 创建一个全屏的窗口,将全屏的图像放在JFrame的窗口上,以供来截屏。 */
Dimension di = Toolkit.getDefaultToolkit().getScreenSize();
ScreenFrame()
{
//设置大小,即全屏
setSize(di);
setTitle("截图");
//返回此窗体的 contentPane对象
getContentPane().add(new DrawRect());
}
class DrawRect extends JPanel implements MouseMotionListener, MouseListener
{
private static final long serialVersionUID = 3L;
/* * 将全屏的图像放在JPanel 上, 可以通过new DrawRect来获得JPanel,并且JPanel上有全屏图像 */
int sx, sy, ex=-1, ey=-1;
int count = 1;
File file = null;
BufferedImage image, getImage;
//截图,新的截图
boolean flag = true;
public DrawRect()
{
try
{
//获取全屏图像数据,返回给image
Robot robot = new Robot();
image = robot.createScreenCapture(new Rectangle(0, 0, di.width, di.height));//获得了全屏的截图
}
catch(Exception e)
{
throw new RuntimeException("截图失败");
}
//添加 鼠标活动事件
addMouseListener(this);
addMouseMotionListener(this);
}
//重写paintComponent,通过repaint 显示出来截屏的范围
public void paintComponent(Graphics g)
{
g.drawImage(image, 0, 0, di.width, di.height, this);
g.setColor(Color.blue);
//System.out.println("鼠标拉动了");
//if(sx < ex && sy < ey)//右下角
g.drawRect(sx, sy, ex - sx, ey - sy);
}
public void mousePressed(MouseEvent e)
{
sx = e.getX();
sy = e.getY();
}
public void mouseReleased(MouseEvent e)
{
//鼠标单击一下也会执行此代码
//flag = false;
if(e.getButton()==MouseEvent.BUTTON3) {
dispose();
}
//else if(e.getButton()==MouseEvent.BUTTON1){} 加上这一句无法截图
//原因是拉动鼠标的时候,点击的就是鼠标左键
else {
if(ex==-1||ey==-1) {
return;}
try {
Robot ro;
ro = new Robot();
if(sx < ex && sy < ey) {
//右下角
getImage = ro.createScreenCapture(new Rectangle(sx, sy, ex - sx, ey - sy));
ImageIcon icon=new ImageIcon(getImage);
JLabel label=new JLabel(icon);
JFrame myframe =new JFrame();
myframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
myframe.add(label);
myframe.setBounds(new Rectangle(sx+80, sy+80,ex - sx+80, ey - sy+80));
myframe.setTitle("Image "+AddNum.Addnum());
myframe.setVisible(true);
myframe.setAlwaysOnTop(true);
int s_width=myframe.getWidth();
int s_height=myframe.getHeight();
Dimension s_de=new Dimension(s_width,s_height);
label.setSize(s_de);
dispose();
}
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
//鼠标移动中,通过repaint 画出要截屏的范围
public void mouseDragged(MouseEvent e)
{
ex = e.getX();
ey = e.getY();
repaint();
}
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
}
}
package Num;
public class AddNum{
static int num=0;
public static int Addnum() {
num++;
return num;
}
}
这个完全满足的自己的需要。还用了次exe4j。
缺点就是占内存有点多吧,功能也太少了。
今天的文章非常简单的截图小工具分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65978.html