2016-06-13 4 views
3

私のタイトルはひどく私の問題が説明するのは非常に困難であるため、言葉を選んだので、私はそれのためにイメージを描いている閉じScrollPaneのポップアップの追加:のJavaFX - ユーザーはそれからクリックしたときに

enter image description here

私が持っているの(ポーカーカードではなく、例として使用した)カードの山を表すImageViewオブジェクト。この画像ビューをクリックすると、ScrollPaneを備えたポップアップウィンドウが必要になり、リンクリストにあるすべてのカードオブジェクトが表示されます。ユーザーがウインドウの外側の任意の場所をクリックすると(その後、マウスの右ボタンをクリックすると)、スクロールペインウィンドウを閉じる必要があります。私はすでに試してみました

方法:APPLICATION_MODALと

  • シーン。その後、Scene.showAndWait()を実行しました。ユーザーのタスクバーに別のアプリケーションが作成されたため、このメソッドが気に入らなかった。それはまた、厄介で気分が悪かったと感じました。

  • ルートペインをStackPaneに変更し、ユーザーがデッキをクリックしたときにこのスクロールペインをスタックペインに追加しました。何らかの理由でこれは本当に遅く、本当に目立たないようでした。私の代わりのクラスはルートペインにアクセスする必要があったので、迷惑だった。なぜなら、クローズすると、ルートのStackPaneに行き、.remove()をそれ自身で呼び出す必要があったからだ。

これを達成する他の方法はありますか?私のアプリケーションにはこれらのファイルがたくさんあるので、このフレームワークは非常にうまく動作する必要があります。

答えて

2

このアプローチで問題を解決するには、いくつかの制限を設けて新しいStageを開こうと提案します。

StageinitOwnerプロパティを使用して、別のStageを所有者として使用することができます。したがって、他のアイコンはタスクバーに表示されません。

あなたはこれが唯一のコンテンツが表示されていることを保証します、TRANSPARENTまたはUNDECORATEDStageStlyeinitStyleプロパティを使用することができます。

最後にfocusedPropertyを使用して、Stageがフォーカスを失って閉じていないかどうかを確認できます。

新しいStageで開くが、は、例えば使用Stageの内容と重複現在Stage内部ScrollPaneを描画しないことももちろん可能である

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 

      Button b = new Button("Open deck"); 
      b.setOnAction(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 
        Stage popupStage = new Stage(); 

        popupStage.initOwner(primaryStage); 
        popupStage.initStyle(StageStyle.UNDECORATED); 
        Scene sc = new Scene(new ScrollPane(), 300, 300); 
        popupStage.setScene(sc); 

        popupStage.focusedProperty().addListener(new ChangeListener<Boolean>() { 

         @Override 
         public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, 
           Boolean newValue) { 
          if(!newValue) 
           popupStage.close(); 

         } 
        }); 

        popupStage.show(); 

       } 
      }); 

      root.setCenter(b); 


      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

AnchorPaneまたはGroupをルートとして使用しますが、最初の解決方法では、メインStageのサイズに拘束されないという利点があります(ポップアップには任意のサイズを指定できます)。

+0

ありがとうございます。私はそれが可能であるとは考えていませんでした。 – Hatefiend

+0

私はこれが助けてくれることを願っています:)もし必要な調整が必要であれば(フォーカスを失うと直ちに終了するので)、助けが必要な場合はここでコメントしてください。 – DVarga

0

これは、マウスイベントをキャッチする低レベルのシステムフックで実現できます。

http://kra.lc/blog/2016/02/java-global-system-hook/またはhttps://github.com/kwhat/jnativehook/releases

私はそう私はあなたの質問が間違ってました、それはあなたが必要なものであると思います。

+0

システムフックとは何ですか?私はマウスのイベントをうまく検出することができます、それは難しい部分であるペインです。 – Hatefiend

+0

@Hatefiendああ申し訳ありませんが、私は間違っています。私はあなたがウインドウの外のマウスクリリスも意味すると思った。 – ScriptKiddy

+0

ああ、申し訳ありません、私はポップアップウィンドウ(カードの山の中に何が表示されているか)の外でマウスクリックを意味しました – Hatefiend

関連する問題