2016-04-13 15 views
4

基本的にユーザー画面全体をCanvasオブジェクトでオーバーレイするJavaFXアプリケーションを作成したいので、基本的にユーザーの画面に何かを描画できます。マウスとキーのイベントを無視するJavaFX透過ウィンドウの作成

画面全体を覆うウィンドウを作成するのは簡単です。 https://assylias.wordpress.com/2013/12/08/383/

私を止める唯一の事実は、明らかにウィンドウが透明ではあるが、それでもユーザーのマウスとキーイベントをキャプチャするという事実です。

私はこれを達成する方法はありますか?より具体的な例として、どこに行くにしても、ユーザーのマウスカーソルを赤い丸で囲んでみたいと考えていますが、ユーザー入力は中断されません。

答えて

4

ではできません。 JavaFX。

あなたは私の答えhereをチェックアウトすることができます。それは最も近いことです。しかし、デスクトップ全体に透明なキャンバスを重ね合わせたり、マウスのイベントを基になるウィンドウに転送することはできません。

キャンバスを半透明にすると、すべてのイベントがキャッチされますが、基礎となるウィンドウが表示されます。しかし、キャンバスを完全に透明にすると、アプリケーションはイベントをキャッチしません。

ただし、「具体的な例」は別の方法で解決できます。ここでは、コードです:

import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.PointerInfo; 

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class CircleAroundCursor extends Application { 

    double radius = 50; 

    @Override 
    public void start(Stage primaryStage) { 

     Group root = new Group(); 

     Circle circle = new Circle(radius * 2,radius * 2,radius); 
     circle.setStroke(Color.RED); 
     circle.setFill(Color.TRANSPARENT); 

     root.getChildren().add(circle); 

     Scene scene = new Scene(root, Color.TRANSPARENT); 

     scene.getRoot().setStyle("-fx-background-color: transparent"); 

     primaryStage.initStyle(StageStyle.TRANSPARENT); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     primaryStage.setAlwaysOnTop(true); 


     AnimationTimer loop = new AnimationTimer() { 

      @Override 
      public void handle(long now) { 

       PointerInfo info = MouseInfo.getPointerInfo(); 
       Point p = info.getLocation(); 

       primaryStage.setX(p.getX() - radius * 2); 
       primaryStage.setY(p.getY() - radius * 2); 

      } 
     }; 
     loop.start(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

この少なくともを解決し、「それはどこへ行っても、私は赤い丸を作りたいが、ユーザーのマウスカーソルを囲むが、ユーザーの入力が中断されることはありません」

注:ここではAWTクラスはFXクラスと混在しています。 EDT & FXスレッド処理を使用する必要があります。それはなくても動作します。

スクリーンショット:

enter image description here

+0

赤丸の例を実行していて、ユーザーのマウス入力が実際に中断されています。基本的にどこでもクリックすると(テキストの選択など)は機能しません。私はMac OSXを使用していますが、マウスクリックが中断されていない唯一の部分はドックにあります。これはアプリケーションがドックにオーバーレイできないためです。 – Voldemort

+0

これはWindows 10で動作します。しかし、私が言ったように、あなたが望むのは普通のJavaFXでは不可能です。OS固有のコーディングを使用する必要があります。 – Roland

+0

'setMouseTransparent(true)'や 'setPickOnBounds(false)'を使ってみましたか? – jns

2

あなたはRobotクラスを見ていることがあります。私はその能力を何度も乱用してきましたが、私はそのクラスをハッキーとして使ったほとんどのソリューションを考えています。

  • はの助けを借りて、同じのMouseEventを呼び出す不可視のウィンドウ
  • を作る描くようなあなたのことを行う

    1. インターセプトたMouseEventをし、そのプロパティを保存します。

      たぶん、あなたはこのようにそれを行うことができますRobot

    2. Windowsを再度表示させる
  • 関連する問題