2014-01-14 6 views
5

ボタンをクリックすると、その位置が変更されます。JavaFXでノードを明示的に配置する

しかし、マウスを動かすと、ボタンがシーンの中央に戻ります。なぜですか?

は、私は次のコードをしている:

public class HolaMundo extends Application { 

    Button btn; 
    Scene scene; 

    @Override 
    public void start(Stage primaryStage) { 
     btn = new Button(); 
     btn.setText("Hola Mundo"); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     scene.setOnMouseMoved(new EventHandler<MouseEvent>(){ 

      @Override 
      public void handle(MouseEvent t) { 
       btn.setText(String.valueOf(t.getX())); 
      } 
     }); 

     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       btn.setLayoutX(Math.random() * (300 - btn.getWidth())); 
       btn.setLayoutY(Math.random() * (250 - btn.getHeight())); 
      } 
     }); 
    } 

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

あなたはどのJavaFXのバージョンを使用していますか? JavaFX 8では、ボタンはまったく動かない。 – assylias

答えて

14

あなたの特定のコードスニペットのために提案アプローチ

は、最善のアプローチです。あなたのコードは、あなたが手動でレイアウト値を設定しようとしている場合は、自動的にレイアウト値を設定します(例えばStackPaneなど)レイアウトペインを使用していないあなたは

やりたいことはありませんなぜ

。レイアウトペインを使用すると、次にレイアウトペインでレイアウトパスを実行するときに、明示的に設定したレイアウト値が自動的に上書きされます(サイズ変更されたり、シーングラフの内容や場所が汚れてしまうなど)。

  1. サブクラスRegionlayoutChildrenを上書き:あなたはJavaFXの中に明示的にレイアウト項目は次のいずれかを実行したい場合は、明示的にノード

    をレイアウトするための

    オプション。

  2. コンテナにCSSスタイルを適用するか、サイズ変更機能を実装する必要がある場合は、コンテンツをPaneに配置します。
  3. コンテナにCSSでスタイルを設定する必要がない場合、またはサイズ変更機能を実装する必要がない場合は、コンテンツをGroupに配置します。ノードの位置

関連アドバイス自動的にあらかじめ定義されたレイアウトマネージャを使用してコンポーネントをレイアウトしていたいが、あなたは調整したり、一時的にそれらのデフォルト位置からの部品のいくつかの場所を変更する場合layoutX/Y値ではなく、translateX/Y値を調整することができます。translateXの定義によれば:

ノードの最終的な変換はlayoutXノードの安定した位置を確立し、移動Xは、必要に応じてその位置を動的に調整を行いlayoutX +移動X、として計算されます。 この変数を使用すると、layoutBoundsに影響を与えずにノードの位置を変更できます。これにより、ノードの位置をアニメートするのに便利です。

これは、レイアウトマネージャがlayoutXを使用して、子のデフォルトの位置を計算することができ、あなたがtranslateXを使用して、デフォルトの位置を調整できることを意味します。

0

が深く、現在のケースを調査しなかったので、私は上のボタンを配置する代わりにStackPaneのAnchorPaneを使用する場合、私は違いを参照してください。

mouseMoved-EventによってButtonのラベルテキストを変更すると、ペインがレンダリングされます(レイアウトが要求されます)。 StackPaneがすべての子をその中央に配置すると、Buttonの位置はペインの中央にリセットされます。 StackPaneのlayoutChildrenメソッドを調べると、resizeRelocateが呼び出されます。したがって、layoutXとlayoutYはリセットされ、ボタンは中央の位置(またはStackPaneの配置を設定するもの)に戻ります。

だから、これはStackPaneの正しい動作だと思います。別のペインを使用することをお勧めします。 AnchorPane。おそらくPane代わりStackPaneのを使用して

関連する問題