2017-09-01 45 views
0

我正在尋找移動nodes(在我的情況下爲TextField)以及調整它們的大小的方法。JavaFX - 調整大小和/或移動節點(例如TextFields)

下面是一個基本的例子:

public class Main extends Application{ 

private static final Pane pane = new Pane(); 

public void start(Stage stage) { 
    TextField txtField = new TextField(); 
    txtField.relocate(300, 0); 
    Button btnS = new Button("Change size"); 
    btnS.setPrefSize(100, 20); 
    btnS.relocate(0, 0); 
    btnS.setOnAction(e -> { 
     ScaleTransition transition = new ScaleTransition(Duration.millis(300), txtField); 
     transition.setByX(2); 
     transition.play(); 
    }); 

    Button btnP = new Button("Change Position"); 
    btnP.setPrefSize(100, 20); 
    btnP.relocate(110, 0); 
    btnP.setOnAction(e -> { 
     PathTransition transition = new PathTransition(); 
     transition.setNode(txtField); 
     transition.setPath(new Path(new MoveTo(300, 50))); 
     transition.play(); 
    }); 

    pane.getChildren().addAll(btnS, btnP, txtField); 
    Scene scene = new Scene(pane); 
    pane.setPrefSize(500, 100); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

我想TextField改變it's寬度只有右側(所以它看起來像it's「滑動體」(自左而變得更寬)正確的)。我認爲我的嘗試是錯誤的,因爲我不想調整它,但調整大小它(它的縮放TextField工程儘管)。 或者是通過創建一個循環來改變尺寸的唯一方法,它將每次迭代的量增加到寬度上?

其他Button應該移動TextField。這一次我認爲我的嘗試是正確的,但是代碼不起作用,我無法解釋。

會有人幫我在這裏嗎?謝謝。

回答

2

就改變寬度TextField而言。循環將不起作用,因爲您將阻止負責佈局的線程。如何調整節點大小取決於父級,因爲顯示寬度由佈局期間父級決定。在這種情況下,你可以使用一個簡單的Timeline動畫prefWidth屬性:

Timeline timeline = new Timeline(
     new KeyFrame(Duration.ZERO, new KeyValue(txtField.prefWidthProperty(), txtField.getWidth())), 
     new KeyFrame(Duration.millis(300), new KeyValue(txtField.prefWidthProperty(), 300))); 

timeline.play(); 

另一個按鈕應該移動TextField。這一次我認爲我的嘗試是正確的,但是代碼不起作用,我無法解釋。

看看你使用的路徑是什麼樣的。沒有任何東西被繪製,因爲你只使用一個單一的MoveTo元素。你要麼需要修復的路徑或者我們更簡單TranslateTransition

TranslateTransition transition = new TranslateTransition(Duration.millis(400), txtField); 
transition.setToY(50); 
transition.play(); 

注:您可能需要爲了得到重複點擊想要的效果來調整代碼。