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

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;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现123n_java三线程交替打印123……n

使用多线程交替打印1--n,a进程打印1,4,7,……(3n1),b进程打印2,7,10,……(3n2),c进程打印3,6,9,……(3n)涉及到多线程的同步,阻塞,wait,notify代码如下Num.javapublic class Num {private int num 0;public Num(int num) {this.num num;}pu…

8月12

MTBF两次故障的时间,时间越长越好。 MTTR两次系统恢复的时间,越短越好 修改完参数后若出现报205的错误,检查路径 控制文件 SQL> show parameter control_files SQL> select * from v$controlfile; 修改路径: $ cd $ORACLE_H…

spring roo_使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry

spring rooSpring Roo是在Java平台上提供快速应用程序开发的工具。 我已经解释了何时使用它: http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持两种针对云计算的解决方案:Google App Engine(GAE&a…

this指针 java_彻底理解Java中this指针

每次看到Java中的this指针,总摸不着头绪。在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁。(内容摘自:http://www.mathcs.emory.edu/~cheung/Courses/170.2010/Syllabus/03/…

python中的浅拷贝和深拷贝

本篇介绍下python中的深拷贝和浅拷贝,主要从基本类型、类、不可变类型等方面进行介绍。 1.介绍拷贝之前首先应该明白is和的区别,即is表示同一个对象,比较的是值 >>> a 1000 >>> b 1000 >>> a b True >>&…

Spring开发人员知道的一件事

在最近关于(核心)Spring Framework的培训课程中,有人问我:“(Java)Spring开发人员是否应该知道一件事,那应该是什么?” 这个问题使我措手不及。 是的,(核心&a…

mysql匿名事务gtid_MySQL GTID (二)

MySQL GTID 系列之二三.在线将GTID转化为传统模式环境见上篇系列文章关闭GTID,不用停止服务,不影响线上业务3.1 关闭GTID复制,调整为传统复制#SLVAE实例上停止复制STOP SLAVE#SLVAE实例上查看复制的位置SHOW SLAVE STATUS \G# 查看 Master_Log_File 和 Read_Master_Log_Pos对应…

JavaWeb(十七)——JSP中的九个内置对象

一、JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。  由于JSP第一次访问…

jrockit_JRockit – JRCMD有用的命令

jrockit自2007年以来,我一直在使用JRockit。我发现它的速度比Hotspot慢,但在诊断和分析问题上总是更好。 从去年夏天开始,我一直在为一家国际电信系统供应商工作。 我们在HP OpenCall融合通信平台之上为电信运营商设计和实施各种产品。 我是开…

java并发问题_并发理论基础:并发问题产生的三大根源

并发问题变幻莫测,一谈到并发就显得非常高深,一般的程序员对于并发问题也是头疼不已,但是随着网络互联越来越普遍,大规模用户访问网站程序也越来越频繁,并发问题又无法避免。在我们解决并发问题前首先要理解产生并发问…

[luoguP1849] [USACO12MAR]拖拉机Tractor(spfa)

传送门 神奇的spfa #include <queue> #include <cstdio> #include <cstring> #include <iostream> #define N 1010 #define max(x, y) ((x) > (y) ? (x) : (y))int n, mx, my; int dis[N][N]; bool map[N][N], vis[N][N]; int dx[4] {0, -1, 0, 1…

在Eclipse上创建JSF / CDI Maven项目

当我在研究JSF和CDI示例时&#xff0c;我认为提及创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下&#xff0c;M2E插件随附的Eclipse Luna。 因此&#xff0c;无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->新建->其他。…

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定&#xff2e;个点以及每个点的权值&#xff0c;要你处理接下来的&#xff2d;个操作。操作有&#xff14;种。操作从&#xff10;到&#xff13;编号。点从&#xff11;到&#xff2e;编号。 &#xff10;&#xff1a;后接两个整数&#xff08;&a…

python爬虫多进程_Python爬虫技术--基础篇--多进程

要让Python程序实现多进程(multiprocessing)&#xff0c;我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用&#xff0c;它非常特殊。普通的函数调用&#xff0c;调用一次&#xff0c;返回一次&#xff0c;但是fork()调用一次&#xff0c;返回两次&am…

java 电力系统_算法java实现--动态规划--电路布线问题

/** dianlubuxian.java* Version 1.0.0* Created on 2017年11月30日* Copyright ReYo.Cn*/package reyo.sdk.utils.test.dy;/*** 创 建 人&#xff1a;AdministratorReyoAut * 创建时间&#xff1a;2017年11月30日 下午4:58:56** author ReYo* version 1.0*//*** 电路布线问题(…

百度图片网址

http://qcloud.dpfile.com/pc/jPAgaVMWC7zueHYEzky7IUJs0w6QIgvTQ0p08wxCK1OUDUk6-KqvLg70OVUXtjEHTYGVDmosZWTLal1WbWRW3A.jpg转载于:https://www.cnblogs.com/leshen/p/7387677.html

antlr idea 入门_ANTLR:入门

antlr idea 入门这篇文章使您了解ANTLR的基础知识。 以前&#xff0c;我们已经了解了如何将ANTLR设置为外部工具。 在这里&#xff1a; ANTLR外部工具 :) 所以&#xff0c;我们开始…。 什么是ANTLR&#xff1f; •另一个语言识别工具&#xff0c;是一种语言工具&#xff0c;它…

typescript主键自增长

常见的不重复id创建方式有两种&#xff0c;一个是搞一个自增长数列&#xff0c;另一个是采用随机生成一组不可能重复的字符序列&#xff0c;常见的就是UUID了。我们来引入一个uuid的包&#xff1a;npm i --save angular2-uuid&#xff0c;由于这个包中已经含有了用于typescript…

java api操作hbase_通过JavaAPI使用HBase

1.准备工作(1) 启动zookeeper服务&#xff0c;我的是在本地启动zookeeper/usr/local/zookeeper/bin$ sudo zkServer.sh start(2) 启动HBase和HBase shell启动HBase:/usr/local/hbase/bin下启动start-hbase.sh启动HBase shell/usr/local/hbase/bin下终端输入hbase shell(3) 工程…

SPOJ QTREE5 lct

题目链接 对于每一个节点&#xff0c;记录这个节点所在链的信息&#xff1a; ls:&#xff08;链的上端点&#xff09;距离链内部近期的白点距离 rs:&#xff08;链的下端点&#xff09;距离链内部近期的白点距离 注意以上都是实边 虚边的信息用一个set维护。 set维护的是…