dillon-admin-pro/dillon-ui/dillon-ui-fx/src/test/java/MacOSBlurEffectExample.java
2024-11-24 15:14:22 +08:00

82 lines
3.0 KiB
Java

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class MacOSBlurEffectExample extends Application {
public interface CocoaLibrary extends Library {
CocoaLibrary INSTANCE = Native.load("Cocoa", CocoaLibrary.class);
Pointer objc_getClass(String className);
Pointer sel_registerName(String selector);
Pointer objc_msgSend(Pointer receiver, Pointer selector);
Pointer objc_msgSend(Pointer receiver, Pointer selector, Pointer arg1);
Pointer objc_msgSend(Pointer receiver, Pointer selector, Pointer arg1, Pointer arg2);
}
private Pointer nsVisualEffectViewClass;
private Pointer nsVisualEffectView;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// 创建一个按钮
Button button = new Button("点击我");
// 创建一个StackPane作为根节点
StackPane root = new StackPane();
root.getChildren().add(button);
// 创建场景
Scene scene = new Scene(root, 600, 400);
primaryStage.setTitle("macOS 模糊效果示例");
primaryStage.setScene(scene);
primaryStage.show();
// 实现模糊效果
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
applyBlurEffect(primaryStage);
}
}
private void applyBlurEffect(Stage stage) {
// 获取 NSVisualEffectView 类
nsVisualEffectViewClass = CocoaLibrary.INSTANCE.objc_getClass("NSVisualEffectView");
if (nsVisualEffectViewClass == null) {
System.err.println("Failed to get NSVisualEffectView class.");
return;
}
// 创建 NSVisualEffectView 的实例
Pointer effectView = CocoaLibrary.INSTANCE.objc_msgSend(nsVisualEffectViewClass,
CocoaLibrary.INSTANCE.sel_registerName("alloc"));
if (effectView == null) {
System.err.println("Failed to allocate NSVisualEffectView.");
return;
}
effectView = CocoaLibrary.INSTANCE.objc_msgSend(effectView,
CocoaLibrary.INSTANCE.sel_registerName("initWithFrame:"), Pointer.NULL);
if (effectView == null) {
System.err.println("Failed to initialize NSVisualEffectView.");
return;
}
// 设置模糊效果
CocoaLibrary.INSTANCE.objc_msgSend(effectView,
CocoaLibrary.INSTANCE.sel_registerName("setMaterial:"),
CocoaLibrary.INSTANCE.objc_msgSend(nsVisualEffectViewClass,
CocoaLibrary.INSTANCE.sel_registerName("materialDark")));
// 在这里将 effectView 添加到 JavaFX 的窗口中,可能需要额外处理
// 直接在 JavaFX 窗口中添加可能需要使用 JFXPanel 或 SWT
}
}