2016-11-20 16 views
3

splitpaneのサイズを変更するたびにリスナーを追加する方法はありますか?
私は現在のウィンドウまたはディバイダのサイズが変更されるたびに検出しリスナを仕切り位置に追加する方法は?

split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>(){ 
    public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth){ 
     //code 
    } 
}); 

がありますが、私は唯一の分周器の位置は、私はマウスでドラッグしたときのように、変更されたときに知っておく必要があります。それを行う方法はありますか?どんな助けもありがとう!

+0

ここで大きな画像は何ですか?ウィンドウの大きさが変わるたびにスライダも動きます。なぜあなたはそれをドラッグするユーザーについて知りたいのですか? –

答えて

3

これを行う方法はまったくありませんが、たとえばSplitPaneCSS lookupを使用して可能です。

除算器のCSSクラスがsplit-pane-dividerであるため、シーングラフから仕切りを得ることができ、実際にはStackPaneのインスタンスになります。

これらのStackPaneでは、マウスの押したイベントリスナーとマウスのリリースイベントリスナーを登録し、その時点でディバイダが「ドラッグ中」であることを示すクラスメンバを更新できます。 positionプロパティリスナーでは、このクラスメンバをチェックすることができます。これが真の場合は、ディバイダがマウスによって移動されていることを意味します。そうでない場合、変更は無視されます。

例:

public class Main extends Application { 

    // Indicates that the divider is currently dragged by the mouse 
    private boolean mouseDragOnDivider = false; 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 

     SplitPane sp = new SplitPane(); 

     sp.getItems().addAll(new StackPane(), new StackPane()); 
     sp.setDividerPositions(0.3f); 

     // Listen to the position property 
     sp.getDividers().get(0).positionProperty().addListener((obs, oldVal, newVal) -> { 
      if(mouseDragOnDivider) 
       System.out.println("It's a mouse drag to pos: " + newVal.doubleValue()); 
     }); 

     primaryStage.setScene(new Scene(sp, 300, 275)); 

     sp.requestLayout(); 
     sp.applyCss(); 

     // For each divider register a mouse pressed and a released listener 
     for(Node node: sp.lookupAll(".split-pane-divider")) { 
      node.setOnMousePressed(evMousePressed -> mouseDragOnDivider = true); 
      node.setOnMouseReleased(evMouseReleased -> mouseDragOnDivider = false); 
     } 

     primaryStage.show(); 
    } 


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

注: レイアウトが作成され、CSSが適用されている場合、ルックアップはのみ動作としては、それゆえ、requestLayout()applyCss()メソッドがすでに実行されていることが重要ですまた、SplitPaneが既にシーングラフ(Sceneに添付)に追加されていることが必要です。

関連する問題