javaFx实现鼠标穿透画布,同时操作画布和桌面,背景透明,类似ppt批注

这篇具有很好参考价值的文章主要介绍了javaFx实现鼠标穿透画布,同时操作画布和桌面,背景透明,类似ppt批注。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 系列文章专栏:javafx图形绘制、桌面录屏录音源码合集    

目录

         一、实现的功能和效果

二、程序实现

三、总结


一、实现的功能和效果

        今天,我们要用javaFx来实现一个鼠标穿透画布的功能,该需求来自于在我们的javaFx桌面应用中,需要实现一个悬浮的桌面侧边工具栏,在工具栏中有画笔绘制,批注的功能,能够实现在任何软件之上做笔记绘制,同时可以操作工具栏下一层的所有软件。

        我把这个功能提出来了,写了一个demo。大致效果如下:

javafx设置背景透明,java项目源码合集100+,javafx,鼠标穿透,画布穿透,ppt批注,背景透明

 当程序启动后,程序的整个背景是透明的,除了程序中的组件,如按钮,这个时候即可以看到背面的任何软件,桌面,也能看到程序中的组件。此时,可以在整个桌面上进行画笔的绘制。

   当我点击鼠标穿透按钮后,画布上的笔记正常显示,同时,我的鼠标可以操作背面的任何软件

javafx设置背景透明,java项目源码合集100+,javafx,鼠标穿透,画布穿透,ppt批注,背景透明

     通过上图中的圆圈圈起来的鼠标光标,可以得知,此时我是可以操作背面的程序的。


二、程序实现

      要实现以上效果,其实最关键的几点是:

    1)需要把javaFx中的Scene和stage的背景设置为透明

    scene.setFill(Color.TRANSPARENT);
        stage.initStyle(StageStyle.TRANSPARENT);

 2)一开始要能够看到当前javafx程序背面的东西,需要设置背景为透明,但不是完全透明,此时才可以在画布上绘制

pane.setStyle("-fx-background-color: rgba(255,255,255,0.1);");

3)要实现鼠标穿透当前画布,进而可以操作画布背面的其它软件,则需要将画布的背景设置为完全透明,透明度为0

pane.setStyle("-fx-background-color: rgba(255,255,255,0);");

4)当不需要操作背面的软件,希望回到画布的绘制时,再把背景的透明度设置为0.1即可。

 是不是很简单呢,好的。以下是实现的全部代码。

package test;

import java.io.IOException;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polyline;
import javafx.scene.shape.StrokeLineCap;
import javafx.scene.shape.StrokeLineJoin;
import javafx.scene.shape.StrokeType;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;


public class Test extends Application {
	boolean transpant = false;
	Polyline polyline;
	Button btn  ;
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub

		
		Pane pane = new Pane();
		
		Rectangle2D bounds = Screen.getPrimary().getVisualBounds();
		double screenWidth = bounds.getWidth();
		double screenHeight = bounds.getHeight();
		 btn = new Button("鼠标穿透");
		btn.setPrefWidth(100);
		btn.setPrefHeight(50);
	
		btn.setLayoutX(screenWidth/2);
		btn.setLayoutY(screenHeight/2);
		pane.getChildren().add(btn);
		
		Scene scene = new Scene(pane, screenWidth, screenHeight);
		scene.setFill(Color.TRANSPARENT);
//		scene.getStylesheets().add(ToolsBarStage.class.getResource("/res/css/default.css").toExternalForm());
		stage.initStyle(StageStyle.TRANSPARENT);//
		pane.setStyle("-fx-background-color: rgba(255,255,255,0.1);");
		stage.setScene(scene); // Place the scene in the stage
		stage.show();
		stage.setAlwaysOnTop(true);	
		
		
		//点击按钮后,切换为批注模式或操作模式
		btn.setOnMouseClicked(new EventHandler<Event>() {
			@Override
			public void handle(Event event) {
				// TODO Auto-generated method stub
				if(!transpant) {//关键点,实现鼠标 穿透到可以操作桌面背景
					pane.setStyle("-fx-background-color: rgba(255,255,255,0);");
					transpant = true;
					
				}else {
					pane.setStyle("-fx-background-color: rgba(255,255,255,0.1);");
					transpant = false;
					
				}
			}
			
		});
		
		
		//根据鼠标的拖动和按压进行绘制
		pane.setOnMousePressed(e -> {
			//设置线条的样式
			StrokeType strokeType = StrokeType.CENTERED;
			int strokeMiterLimit = 5;
			StrokeLineJoin strokeLineJoin = StrokeLineJoin.BEVEL;
			StrokeLineCap strokeLineCap = StrokeLineCap.ROUND;
			
			 polyline = new Polyline();
			polyline.setStrokeLineCap(strokeLineCap);
			polyline.setStrokeLineJoin(strokeLineJoin);
			polyline.setStrokeMiterLimit(strokeMiterLimit);
			polyline.setStrokeType(strokeType);

			polyline.setStrokeWidth(2);
			polyline.setSmooth(true);
		
			pane.getChildren().add(polyline);
		});
	
		//鼠标拖动绘制
		pane.setOnMouseDragged(e -> {
			polyline.getPoints().add(e.getSceneX());
			polyline.getPoints().add( e.getSceneY());
		});
		
	
	
   }
	public static void main(String[] args) {
		Test test = new Test();
		  
		  Platform.runLater(() -> {
			  try {
				  Stage stage = new Stage();
					test.start(stage);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
          });
		
	}
}

    


三、总结

      本节使用javaFx实现了一个鼠标穿透画布的功能,该需求来自于在我们的javaFx桌面应用中,需要实现一个悬浮的桌面侧边工具栏,在工具栏中有画笔绘制,批注的功能,能够实现在任何软件之上做笔记绘制,同时可以操作工具栏下一层的所有软件。适用于javafx图形绘制的学习,以及制作桌面悬浮软件,比如桌面整理工具,桌面悬浮球等。文章来源地址https://www.toymoban.com/news/detail-537704.html

到了这里,关于javaFx实现鼠标穿透画布,同时操作画布和桌面,背景透明,类似ppt批注的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • canvas实现鼠标滚轮滚动缩放画布

    canvas实现鼠标滚轮滚动缩放画布效果

    2024年02月04日
    浏览(30)
  • 基于fabric.js的图片编辑器, 画布背景实现原理

    使用了element-plus提供的图片上传 el-upload 组件 图片上传支持两种元素,普通图片元素和背景图片元素,所以定义属性type进行区分 type为 Image 为普通图片, background 为背景 背景也是一张图片,使用fabric.Image创建图片元素 因为没有图片服务器所以把上传的文件转换了base64图片,作为f

    2024年02月02日
    浏览(36)
  • windows、win10、win7开机登录进桌面进去只有鼠标,黑屏不显示图标、背景

    这种情况是文件管理器运行失败造成的,可以重装系统永久解决,也可以安装如下操作 1、按键盘上的Ctrl+Alt+Del组合键,打开任务管理器 2、点击文件--运行新任务,输入Explorer.exe,勾选以系统管理权限创建此任务,点击确定即可  3、接着按win+r打开运行窗口,输入regedit打开

    2024年02月10日
    浏览(39)
  • 基于Easyx实现同时接收键盘鼠标消息

    说明:本示例开发环境为vs2019 且需要C++11语法支持,旨在帮助初学者能够以更便捷的方式使用IO设备。 头文件中的两个监听器专门用于监听鼠标、键盘消息。 两个监听器的参数均为函数指针,因此事件触发后具体执行哪些事情完全由你来决定。你只需要编写两个对应的处理函

    2024年01月17日
    浏览(35)
  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「内网穿透」

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月05日
    浏览(41)
  • Python matplotlib 中更换画布背景颜色

    在图像中需要区分其他的颜色字体,可以相对应给画布加上背景颜色 下面的方法中 通过简单的代码进行讲解 在代码中增加此行代码: plt.rcParams[\\\'axes.facecolor\\\'] = \\\'black\\\' 示例代码如下: 注意事项: 代码位置放哪都可 该项目中的代码块都会编程相应的画布颜色,如果需要设置回

    2024年02月11日
    浏览(35)
  • SpringBoot整合JavaFX进行桌面应用开发

    目录 一、创建一个spring boot工程 二、导入JavaFX依赖 三、创建fxml文件以及controller类文件 3.1 创建一个fxml文件 3.2 创建对应的controller文件 四、Scene Builder的使用 4.1 下载安装 4.2 运行 4.3 界面编辑 五、 修改主启动类 六、测试运行 七、Jfoenix 学习参考: 第一步,我们直接使用Sp

    2024年02月06日
    浏览(35)
  • Java实现桌面鼠标坐标获取

    Java自动化开发中使用Robot,有时候需要获取桌面坐标,为了方便获取坐标,用代码实现后直接打包成exe文件方便以后使用。 链接:https://pan.baidu.com/s/1oQcWcbe1hcUDLg4KTsIctQ 提取码:2d42 简单介绍一下如何使用 1.首先选中文本框,使鼠标聚焦文本框 2.将鼠标放到桌面任意一处,点击

    2024年02月12日
    浏览(29)
  • 使用wireguard+frp实现内网穿透远程桌面

    注意:阿里云服务器如果不部署frp发现无法联通,重启下服务器就好了,我也不知道为啥 服务器要求:服务器版本:centos7,内核5.6+最好,有外网ip 1. wireguard服务端部署 2. wireguard客户端配置 3. frps部署 4. frpc配置 ● 配置精简,可直接使用默认值 ● 只需最少的密钥管理工作,

    2024年01月20日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包