📄 screenframe.java
字号:
package screensnap;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ScreenFrame extends MouseAdapter {
private Point start; // 鼠标按下去的点
private Point end; // 鼠标释放时的点
JFrame topFrame = new JFrame(); // 用来将整个活动屏幕覆盖掉,以实现对区域截图
JPanel imagePanel; // 区域截屏时,用来显示整个屏幕的截图
JPanel rectPanel; // 画出鼠标拖动时的选中区域
final BufferedImage im;
public ScreenFrame(final Robot robot, Dimension size) {
rectPanel = new JPanel() {
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
if (start != null && end != null) {
int x = start.x <= end.x ? start.x : end.x;
int y = start.y <= end.y ? start.y : end.y;
Color oldColor = g.getColor();
g.setColor(Color.RED);
g.drawRect(x, y, Math.abs(end.x - start.x), Math.abs(end.y - start.y));
g.setColor(oldColor);
}
}
};
rectPanel.setOpaque(false);
topFrame.getLayeredPane().add(rectPanel, new Integer(50));
rectPanel.setSize(size);
topFrame.setBounds(0, 0, size.width, size.height);
Rectangle rct = new Rectangle(0, 0, (int) size.getWidth(), (int) size.getHeight());
im = robot.createScreenCapture(rct);
imagePanel = new JPanel() {
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.drawImage(im, 0, 0, im.getWidth(), im.getHeight(), null);
}
};
imagePanel.setSize(size);
rectPanel.setSize(size);
topFrame.add(imagePanel);
// 去掉Frame的装饰,变成一个没有边框的面板,实现区域抓屏的关键
topFrame.setUndecorated(true);
topFrame.setVisible(true);
topFrame.addMouseListener(this);
topFrame.addMouseMotionListener(this);
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
end = e.getPoint();
rectPanel.repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
topFrame.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
start = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
topFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
end = e.getPoint();
if (invaildRectangle()) {
topFrame.dispose();
return;
}
Rectangle rct = getDraggedRectangle();
SystemTrayTool.outputImage2SavePlace(im, rct);
start = null;
end = null;
topFrame.dispose();
}
private Rectangle getDraggedRectangle() {
int x = start.x <= end.x ? start.x : end.x;
int y = start.y <= end.y ? start.y : end.y;
Rectangle rct = new Rectangle(x, y, Math.abs(end.x - start.x),
Math.abs(end.y - start.y));
return rct;
}
private boolean invaildRectangle() {
return Math.abs(end.x - start.x) <= 0 || Math.abs(end.y - start.y) <= 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -