2014-01-14 36 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

建議的方法

爲您的特定代碼片段,可能使用的Pane代替StackPane是最好的辦法。

爲什麼你要

你的代碼沒有做。如果你要手動設置佈局值,不使用佈局面板(如StackPane)自動設置佈局值你。如果您使用佈局窗格,則下次佈局窗格執行佈局傳遞(例如,已調整大小或其某些內容或位置在場景圖形中變髒)時,您顯式設置的佈局值將被自動覆蓋。

選項如果你想明確的JavaFX佈局項目執行下列操作之一明確地鋪設節點

  1. 子類Region和覆蓋layoutChildren
  2. 如果您需要使用CSS樣式化容器或實現調整大小功能,請將您的內容放入Pane
  3. 如果您不需要使用CSS樣式化容器或實現調整大小功能,請將您的內容放入Group

節點定位相關的諮詢

如果你想有自動佈置使用預定義的佈局管理器組件,但要調整或暫時的默認位置修改的一些組件的位置,您可以調整translateX/Y值而不是layoutX/Y值。據translateX定義:

節點的最後的翻譯將被計算爲layoutX +平移X,其中layoutX建立了節點的穩定的位置和平移X可選做動態調整到該位置。 這個變量可以用來改變一個節點的位置,而不會影響它的layoutBounds,這對於動畫節點的位置很有用。

這意味着佈局管理器可以計算使用layoutX孩子的默認位置,可以調整使用translateX默認位置。

0

由於沒有深入研究目前的情況下,我看到了差異,當我使用AnchorPane代替StackPane的放置上的按鈕。

通過使用mouseMoved-Event更改按鈕的標籤文本,可以渲染窗格(請求佈局)。使用StackPane將所有孩子放置在其自身中心時,Button的位置將重置爲該窗格的中心。當您查看StackPane的layoutChildren方法時,您會看到對resizeRelocate的調用。所以layoutX和layoutY被重置,並且按鈕移回到中心位置(或者任何你設置的StackPane對齊)。

所以我認爲這是StackPane的正確行爲,我建議使用另一個窗格,例如, AnchorPane。