我正在開發一個應用程序,它需要互相排列節點(或彼此之間等)。但是,這種佈局只是初始位置,用戶可以任意移動這些節點。這是如何在JavaFX中以正確的方式完成的?我將用一個簡化的例子來解釋我的問題:JavaFX節點的自定義佈局
假設我有2個矩形,並且想要將rect2放在rect1的右側。
// create first rectangle at position x= 5, y=5
rect1 = rectangle(5,5);
// create second rectangle to the right of rect1
rect2 = rectangle(5+rect1.width(), 5);
在這種情況下的JavaFX將尚未已經確定Rect1的寬度,這將是零。直觀地,我會執行一個調用,讓JavaFX繪製rect1並確定其寬度,然後添加rect2。看下面的例子:
// create first rectangle at position x= 5, y=5
rect1 = rectangle(5,5);
// let JavaFX draw rect1 (width will be calculated and set)
draw();
// create second rectangle to the right of rect1
rect2 = rectangle(5+rect1.width(), 5);
不幸的是,我還沒有找到一種方法,做我想做的。我目前的解決方法是使用Platform.runLater(),但是這一直無法正常工作。如果我對綁定的理解是正確的,綁定也不適合這個問題。我只想最初佈置節點,所以我將不得不在初始佈局之後刪除綁定(否則,如果移動rect1,則rect2會移動)。
在此先感謝您的幫助。
編輯:這是一個最小的工作示例。按鈕的寬度是0.我試着調用root.layout()來強制佈局傳遞等,但它似乎不工作。
public class Test extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
btn.setText("Say 'Hello World'");
root.getChildren().add(btn);
// prints out 0
System.out.println(btn.getWidth());
}
}
您可以創建'Pane'的子類並覆蓋'layoutChildren()'。但是,我並不真正瞭解「這種佈局只是初始佈局,用戶可以隨意移動這些節點」。當用戶移動節點時,你應該改變'layoutChildren()'方法所要求的一些屬性,這樣它就可以正確地定位子節點。 – 2014-10-08 19:22:28
簡化,如果用戶移動節點我使用節點的方法重定位(posX,posY)。該應用程序類似於圖形編輯器。用戶可以根據自己的意願佈置顯示的節點。因此,我正在使用一個正常的窗格,而不是像GridPane等。 – user3740372 2014-10-08 20:39:15
@James_D我假設在JavaFX調用layoutChildren()方法時給定示例中的寬度將被正確設置?所以這個想法是在任意位置創建rect2,然後將其移動到layoutChildren()中的所需位置。我可以看到這個工作,並會試一試。 – user3740372 2014-10-08 21:04:43