2014-10-08 107 views
0

我正在開發一個應用程序,它需要互相排列節點(或彼此之間等)。但是,這種佈局只是初始位置,用戶可以任意移動這些節點。這是如何在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()); 
} 

} 
+0

您可以創建'Pane'的子類並覆蓋'layoutChildren()'。但是,我並不真正瞭解「這種佈局只是初始佈局,用戶可以隨意移動這些節點」。當用戶移動節點時,你應該改變'layoutChildren()'方法所要求的一些屬性,這樣它就可以正確地定位子節點。 – 2014-10-08 19:22:28

+0

簡化,如果用戶移動節點我使用節點的方法重定位(posX,posY)。該應用程序類似於圖形編輯器。用戶可以根據自己的意願佈置顯示的節點。因此,我正在使用一個正常的窗格,而不是像GridPane等。 – user3740372 2014-10-08 20:39:15

+0

@James_D我假設在JavaFX調用layoutChildren()方法時給定示例中的寬度將被正確設置?所以這個想法是在任意位置創建rect2,然後將其移動到layoutChildren()中的所需位置。我可以看到這個工作,並會試一試。 – user3740372 2014-10-08 21:04:43

回答

0

給出的例子從上面,如果我設置該級的場景爲空,然後重新設置,按鈕寬度將調用的System.out.println當正確設置()。這似乎是在整個舞臺上強制佈局傳球?不過,這似乎是另一個解決方法,特別是我有性能問題。

@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); 

    // reset scene 
    primaryStage.setScene(null); 
    primaryStage.setScene(scene); 

    // prints out 107.0 
    System.out.println(btn.getWidth()); 
}