У меня прозрачная сцена, и мне нужно, чтобы, когда пользователь щелкнул внутри этой сцены, событие мыши было передано окну, которое находится за моей стадией JavaFX (например, если за моей сценой находится текстовый редактор, тогда событие мыши должно быть перешел в это окно редактора). Другими словами, мне нужно, чтобы сцена была прозрачной для событий мыши.
Это мой код:
public class Test12 extends Application {
@Override
public void start(Stage primaryStage) {
var vBox = new VBox();
vBox.setStyle("-fx-border-width: 1; -fx-border-color: black");
vBox.setMouseTransparent(true);
var scene = new Scene(vBox, 400, 300);
scene.setFill(Color.TRANSPARENT);
scene.getStylesheets().add(this.getClass().getResource("test.css").toExternalForm());
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setAlwaysOnTop(true);
}
public static void main(String[] args) {
launch(args);
}
}
Это мое приложение JavaFX, которое с помощью JNA должно делать правую половину окна прозрачной для событий мыши (другими словами, я портировал функцию makeHalfTransparent с C на Java):< /p>
У меня прозрачная сцена, и мне нужно, чтобы, когда пользователь щелкнул внутри этой сцены, событие мыши было передано окну, которое находится за моей стадией JavaFX (например, если за моей сценой находится текстовый редактор, тогда событие мыши должно быть перешел в это окно редактора). Другими словами, мне нужно, чтобы сцена была прозрачной для событий мыши. Это мой код: [code]public class Test12 extends Application {
@Override public void start(Stage primaryStage) { var vBox = new VBox(); vBox.setStyle("-fx-border-width: 1; -fx-border-color: black"); vBox.setMouseTransparent(true); var scene = new Scene(vBox, 400, 300); scene.setFill(Color.TRANSPARENT); scene.getStylesheets().add(this.getClass().getResource("test.css").toExternalForm()); primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(scene); primaryStage.show(); primaryStage.setAlwaysOnTop(true);
}
public static void main(String[] args) { launch(args); } } [/code] CSS [code].root { -fx-background-color: transparent; } [/code] Может ли кто-нибудь сказать, как это сделать, если это возможно? [b]ОБНОВЛЕНИЕ[/b]
Это программа на языке C, которая делает правую половину окна прозрачной для событий мыши (используйте программу gcc -o program.c -lX11 -lXext): [code]#include #include #include #include
while (1) { XNextEvent(dpy, &event); if (event.type == KeyPress) { break; } }
XDestroyWindow(dpy, win); XCloseDisplay(dpy); return 0; } [/code] Это мое приложение JavaFX, которое с помощью JNA должно делать правую половину окна прозрачной для событий мыши (другими словами, я портировал функцию makeHalfTransparent с C на Java):< /p> [code]import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.unix.X11; import com.sun.jna.ptr.PointerByReference; import java.lang.reflect.Method; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.stage.Window; import javafx.stage.StageStyle;
public class JavaFxTest10 extends Application {
public static interface CustomX11 extends Library {
void XChangeProperty(X11.Display display, X11.Window window, X11.Atom property, X11.Atom type, int format, int mode, Pointer data, int nelements);
void XSetFillStyle(X11.Display display, X11.GC gc, int fillStyle);
void XFillRectangle(X11.Display display, X11.Drawable drawable, X11.GC gc, int x, int y, int width, int height); }
public interface Xext extends Library {
Xext INSTANCE = Native.load("Xext", Xext.class);
void XShapeCombineMask(X11.Display display, X11.Window w, int shapeOp, int x, int y, X11.Pixmap shape, int shapeKind); }
@Override public void start(Stage primaryStage) { var button = new Button("Push Me"); button.setOnAction(e -> { var p = getWIndowPoiter(primaryStage); var window = getWindow(p); printWindowTitle(window);//checking pointer makeHalfTransparent(window, (int) primaryStage.getWidth(), (int) primaryStage.getHeight()); }); var hBox = new HBox(button); hBox.setStyle("-fx-background-color: green"); var content = new VBox(); content.setMouseTransparent(true); VBox.setVgrow(content, Priority.ALWAYS);
var mainBox = new VBox(hBox, content); mainBox.setStyle("-fx-border-width: 1; -fx-border-color: black"); var scene = new Scene(mainBox, 400, 300); scene.setFill(Color.TRANSPARENT); scene.getStylesheets().add(this.getClass().getResource("test.css").toExternalForm()); primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(scene); primaryStage.show(); primaryStage.setAlwaysOnTop(true); primaryStage.setTitle("JafaFX Window 777"); }
private Pointer getWIndowPoiter(Stage stage) { try { final Method getPeer = Window.class.getDeclaredMethod("getPeer", null); getPeer.setAccessible(true); final Object tkStage = getPeer.invoke(stage); final Method getRawHandle = tkStage.getClass().getMethod("getRawHandle"); getRawHandle.setAccessible(true); var l = (Long) getRawHandle.invoke(tkStage); final Pointer pointer = new Pointer(l); System.out.println(pointer); return pointer; } catch (Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); return null; } }
public static void main(String[] args) { launch(args); } } [/code] Но в JavaFX это не работает. Может ли кто-нибудь помочь мне сделать окно JavaFX прозрачным для событий мыши для Linux X11?