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

本文展示了如何使用JavaFX创建一个具备鼠标穿透功能的画布,允许在桌面任何软件上进行绘图批注,同时能操作底层应用。通过设置Scene和Stage背景透明,以及调整画布透明度,实现了在画布上绘画和穿透操作的切换。适用于桌面应用开发,特别是需要悬浮工具栏和批注功能的场景。
摘要由CSDN通过智能技术生成

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

目录

         一、实现的功能和效果

二、程序实现

三、总结


一、实现的功能和效果

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

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

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

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

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


二、程序实现

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

    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图形绘制的学习,以及制作桌面悬浮软件,比如桌面整理工具,桌面悬浮球等。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光宅男xxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值