nb-首先要注意的是,这是使用Java 7完成的,在Java 6中创建透明窗口的方式不同,在更新10之下是不可能的(我相信)

基本上,这会创建一个透明窗口,其大小和位置可以覆盖整个虚拟屏幕(也就是说,如果您有多个屏幕,它将覆盖所有虚拟屏幕).

然后我使用JPanel作为主要容器来捕获鼠标事件并执行绘制效果.

面板是透明的.这允许面板(和框架)下方的任何东西保持可见.然后我用透明的颜色画了这个(我这样做只是为了强调事实).

单击并拖动某个区域时,它将被暴露.

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GraphicsDevice;

import java.awt.GraphicsEnvironment;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.geom.Area;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

public class MySnipTool {

public static void main(String[] args) {

new MySnipTool();

}

public MySnipTool() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame("Testing");

frame.setUndecorated(true);

frame.setBackground(new Color(0, 0, 0, 0));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new CapturePane());

Rectangle bounds = getVirtualBounds();

frame.setLocation(bounds.getLocation());

frame.setSize(bounds.getSize());

frame.setAlwaysOnTop(true);

frame.setVisible(true);

}

});

}

public class CapturePane extends JPanel {

private Rectangle selectionBounds;

private Point clickPoint;

public CapturePane() {

setOpaque(false);

MouseAdapter mouseHandler = new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {

System.exit(0);

}

}

@Override

public void mousePressed(MouseEvent e) {

clickPoint = e.getPoint();

selectionBounds = null;

}

@Override

public void mouseReleased(MouseEvent e) {

clickPoint = null;

}

@Override

public void mouseDragged(MouseEvent e) {

Point dragPoint = e.getPoint();

int x = Math.min(clickPoint.x, dragPoint.x);

int y = Math.min(clickPoint.y, dragPoint.y);

int width = Math.max(clickPoint.x - dragPoint.x, dragPoint.x - clickPoint.x);

int height = Math.max(clickPoint.y - dragPoint.y, dragPoint.y - clickPoint.y);

selectionBounds = new Rectangle(x, y, width, height);

repaint();

}

};

addMouseListener(mouseHandler);

addMouseMotionListener(mouseHandler);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

g2d.setColor(new Color(255, 255, 255, 128));

Area fill = new Area(new Rectangle(new Point(0, 0), getSize()));

if (selectionBounds != null) {

fill.subtract(new Area(selectionBounds));

}

g2d.fill(fill);

if (selectionBounds != null) {

g2d.setColor(Color.BLACK);

g2d.draw(selectionBounds);

}

g2d.dispose();

}

}

public static Rectangle getVirtualBounds() {

Rectangle bounds = new Rectangle(0, 0, 0, 0);

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

GraphicsDevice lstGDs[] = ge.getScreenDevices();

for (GraphicsDevice gd : lstGDs) {

bounds.add(gd.getDefaultConfiguration().getBounds());

}

return bounds;

}

}

同样,您可以创建一个用户可以调整大小的透明框架.您将负责自己实施所有调整大小的代码,但解决方案仍然是可行的.

更新

您可能还需要检查操作系统/硬件是否可以支持透明度…

GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();

if (!AWTUtilities.isTranslucencyCapable(config)) {

System.out.println("Transluceny is not supported");

}

if (!AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSPARENT)) {

System.out.println("PerPeixel Transparency is not supported");

}

更新了替代方法

这是解决问题的另一种方法.基本上它需要快速拍摄屏幕并将其渲染到窗口.这样我们就可以根据需要控制突出显示/选择.

这样做的缺点是它是一个静态结果,你不会得到任何当前正在运行的动画效果.

import java.awt.AWTException;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GraphicsDevice;

import java.awt.GraphicsEnvironment;

import java.awt.HeadlessException;

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;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

public class SnipWithScreenShoot {

public static void main(String[] args) {

new SnipWithScreenShoot();

}

public SnipWithScreenShoot() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException ex) {

} catch (InstantiationException ex) {

} catch (IllegalAccessException ex) {

} catch (UnsupportedLookAndFeelException ex) {

}

try {

JFrame frame = new JFrame("Test");

frame.setUndecorated(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new TestPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

} catch (AWTException exp) {

exp.printStackTrace();

System.out.println("That sucks");

}

}

});

}

public class TestPane extends JPanel {

private BufferedImage image;

private Rectangle selection;

public TestPane() throws AWTException {

Robot bot = new Robot();

image = bot.createScreenCapture(getVirtualBounds());

MouseAdapter handler = new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

selection = new Rectangle(e.getPoint());

repaint();

}

@Override

public void mouseDragged(MouseEvent e) {

Point p = e.getPoint();

int width = Math.max(selection.x - e.getX(), e.getX() - selection.x);

int height = Math.max(selection.y - e.getY(), e.getY() - selection.y);

selection.setSize(width, height);

repaint();

}

};

addMouseListener(handler);

addMouseMotionListener(handler);

}

@Override

public Dimension getPreferredSize() {

return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(), image.getHeight());

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

if (image != null) {

Graphics2D g2d = (Graphics2D) g.create();

g2d.drawImage(image, WIDTH, 0, this);

if (selection != null) {

g2d.setColor(new Color(225, 225, 255, 128));

g2d.fill(selection);

g2d.setColor(Color.GRAY);

g2d.draw(selection);

}

g2d.dispose();

}

}

}

public static Rectangle getVirtualBounds() {

Rectangle bounds = new Rectangle(0, 0, 0, 0);

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

GraphicsDevice lstGDs[] = ge.getScreenDevices();

for (GraphicsDevice gd : lstGDs) {

bounds.add(gd.getDefaultConfiguration().getBounds());

}

return bounds;

}

}

java 鼠标拖动矩形_java – 用鼠标拖动创建矩形,而不是绘制相关推荐

  1. java完成键盘动作_java实现鼠标和键盘动作后台监听

    有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等. 我们使用JNA来实现以上的操作 tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代 ...

  2. java 鼠标拖动矩形_java – 用鼠标拖动创建矩形,而不是绘制

    nb-首先要注意的是,这是使用Java 7完成的,在Java 6中创建透明窗口的方式不同,在更新10之下是不可能的(我相信) 基本上,这会创建一个透明窗口,其大小和位置可以覆盖整个虚拟屏幕(也就是说, ...

  3. java模拟器键盘输入_Java模拟鼠标和键盘输入

    用途 在电脑(Windows/Mac)上模拟鼠标和键盘输入 Mac运行需要打开相关权限,详见文末说明. 效果图 代码 import java.awt.*; import java.awt.event. ...

  4. java 最大矩形_Java实现 LeetCode 85 最大矩形

    85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1 ...

  5. java平面内有n个矩形_java有关于M*N矩形求解正方形长方形个数问题

    我们知道在解决实际问题的时候来,方法有许多,可以运用公式,找规律,还可以自己找到一个合适的解题方法来解决这一类问题: 设有一个n*m方格的棋盘(1≤m,n≤100). 求出该棋盘中包含多少个正方形.多 ...

  6. java添加窗体中_java中利用JFrame创建窗体 【转】

    Java代码 publicclassTest(){ publicstaticvoidmain(String[] args){ JFrame frame = newJFrame(); JPanel pa ...

  7. java构建xml参数_Java中使用XML创建EMAIL模板

    邮件模板 让我们来看看邮件模板的格式.模板是XML文件,它包含一个根元素和一系列根的子元素.根元素是.必要的子元素是, , 和 .可选的子元素是 , , 和 .如果你使用过邮件系统,那么你可以推导出这 ...

  8. java 线程池数量_java线程池及创建多少线程合适

    java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...

  9. java excel 展开折叠_Java在Excel中创建多级分组、折叠或展开分组的实现

    本文介绍通过java程序在excel创建分组的方法,可对行或列分组进行分组并设置明细数据是否展开或折叠.设置数据分组并展开或折叠时,可通过以下方法: 方法一: 通过方法sheet.groupbyrow ...

最新文章

  1. 2019全球信息通信业热点回顾
  2. ASP.NET自带机制不刷新页面
  3. 【转】互联网公司都有哪些行业
  4. 功夫熊孟军贤:如何拿到10万种子用户,创业的经验分享
  5. php跨域请求解决方案_swoft2 -跨域与中间件详解
  6. 【程序设计】哨兵控制器
  7. 总结C++中取成员函数地址的几种方法
  8. 微信小程序|area组件使用的地址数据文件
  9. mysql xa 实现_MySQL数据库分布式事务XA的实现原理分析
  10. ncnn数据归一化和结果解析
  11. 微信小程序弹框之获取输入内容(2)
  12. opencv之cvtColor()函数
  13. 2008年金融危机的背后原因以及感悟
  14. python爬虫——爬取小说
  15. 怎样用计算机xp命令修复软件,系统之家xp系统修复控制台命令使用方法
  16. Python Flask 微信验证
  17. ASCII码与16进制的互相转换(表)
  18. 【四】多智能体强化学习(MARL)近年研究概览 {Learning cooperation(协作学习)、Agents modeling agents(智能体建模)}
  19. 怎样将音频变声?1分钟教你音频变声怎么弄!
  20. Java 异步方法转同步

热门文章

  1. linux查看目录文件系统,ubuntu linux 文件系统目录结构-Windows下查看电脑信息的命令-linux菜鸟也必须知道的几个ubuntu最基础命令_169IT.COM...
  2. php 扩展包是什么意思,大家知道扩展用户组是什么意思么??
  3. java servlet 数据库_Java Servlet调用数据库复习
  4. Python 使用穷举法求两个数的最大公约数。
  5. BUUCTF(misc) 假如给我三天光明 (盲文+摩斯密码)
  6. 详解X-shell7的安装与配置
  7. Python3 列表list合并的4种方法
  8. Python模块进阶、标准库、扩展库
  9. python中json文件处理涉及的四个函数json.dumps()和json.loads()、json.dump()和json.load()的区分
  10. resoult在python啥意思,python - __lt__而不是__cmp__