Ich möchte ein Overlay in Java erstellen, das transparent , immer oben und click-through ist. Ich habe einige ähnliche gefunden posts zu diesem Problem, aber selbst nachdem ich ihre Antworten befolgt habe, habe ich ein Problem.
Mein Problem besteht darin, das ganze Fenster durchzuklicken. Ich habe kein Problem damit, dass es mit einem JFrame funktioniert, aber sobald ich irgendwelche Komponenten hinzufügen (JLabel oder ein ImagePanel), überträgt das click-through-Attribut nicht < zu ihnen.
Da ich ein Hintergrundbild für meine Anwendung haben möchte, macht das den Code nutzlos, da ich sehe, wie das Fenster fokussiert wird, wenn ich auf den Bereich klicke, den der Text / das Bild abdeckt.
Bevor ich den Code zeige, den ich verwende, möchte ich zuerst auf diese threads , die genau beschreiben, was ich will, außer in C #.
Mein Ziel ist es, ein Overlay mit einem transparenten .png-Bild und etwas Text oben zu erstellen, der sich bei Schlüsselereignissen ändert. Wenn es JFrame oder eine andere Bibliothek verwendet, ist das egal. Ich brauche es nur mit Windows kompatibel.
Ich möchte auch erwähnen, dass ich etwas Erfahrung mit Java habe, aber ich bin ein Neuling in der Verwendung von JFrame.
%Vor%Beachten Sie, dass das Problem nicht im Fokus des Fensters liegt (obwohl dies auf das Problem zurückzuführen ist), sondern dass JLabel und ImagePanel nicht durchklicken sind .
Das Problem mit einem "Durchklicken" eines Fensters besteht darin, dass es auf einer Systemebene behandelt wird, die außerhalb des Bereichs der Standard-APIs liegt. Dies bedeutet, dass jeder Code, der zum Ausführen eines "Durchklicken" des Fensters geschrieben wird, systemabhängig ist. Davon abgesehen ist der Prozess für die Ausführung unter Windows recht einfach.
Unter Windows 2000 und höher durch Setzen der Flags WS_EX_LAYERED und WS_EX_TRANSPARENT in einem Fenster, dann wird das Fenster durchklicken. Beispielcode verwendet JNA , um dies zu erreichen:
%Vor% Warum nicht einfach das vorhandene JLayeredPane
nutzen? In diesem Blog-Beitrag wird gezeigt, wie Sie einem JFrame eine Vielzahl von Überlagerungen hinzufügen, einschließlich Text und Bildern und dynamisch gezeichnete Pixel.
Ich habe versucht, ein vollständig "ereignistransparentes" (Click-through, wie du es nennst) Fenster zu machen, aber es scheint einige native Einschränkungen für diesen Trick zu geben.
Überprüfen Sie dieses Fensterbeispiel:
%Vor%Fenster und Komponente haben KEINE:
Auch die Komponente sollte jede Art von Mausereignissen ignorieren, auch wenn es Listener aufgrund der modifizierten contains
-Methode gibt.
Wie Sie sehen können, ist der Bereich, in dem auf der Komponente nichts angezeigt wird, ereignistransparent, der befüllte Bereich jedoch nicht. Unglücklicherweise habe ich keine Problemumgehung gefunden, um dieses Verhalten zu ändern. Scheint, dass einige "Low-Level" Java-Methoden die Ereignisse blockieren.
Und das ist nur ein einfaches JComponent-basiertes Beispiel. Ich sage nicht mal über komplexere Swing-Komponenten wie Labels, Buttons e.t.c. die möglicherweise eigene Event-Listener haben, die Ereignisse blockieren könnten.
Tags und Links java swing transparent jna click-through