82 lines
3.0 KiB
Java
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
|
|
}
|
|
} |