2013-07-20 2 views
11

Kann die Reihenfolge der Knoten in der JavaFX2-untergeordneten Liste geändert werden? Ich versuchte und Collections.swap() jedoch werfen beide IllegalArgumentException in Parent als in irgendeinem Punkt die Kinderliste enthält das gleiche Einzelteil an zwei Positionen (wenn Knoten an der neuen Position ist und nicht von der alten Position entfernt worden ist). Innerhalb von Parent gibt es Flags, die JavaFX intern in toFront() und toBack() verwendet, was die Ausnahme verhindert, es gibt jedoch keine Möglichkeit, von außen darauf zuzugreifen.Wie ändert man die Reihenfolge der untergeordneten Elemente in JavaFX

java.lang.IllegalArgumentException: Children: duplicate children added: parent = [email protected] 
    at javafx.scene.Parent$1.onProposedChange(Parent.java:307) 
    at com.sun.javafx.collections.VetoableObservableList.set(VetoableObservableList.java:156) 
    at com.sun.javafx.collections.ObservableListWrapper.set(ObservableListWrapper.java:281) 
    at java.util.Collections.swap(Collections.java:532) 

Antwort

7
ObservableList<Node> workingCollection = FXCollections.observableArrayList(pane.getChildren()); 
Collections.swap(workingCollection, 0, 1); 
pane.getChildren().setAll(workingCollection); 

Siehe diesem Code:

package swapnode; 

import java.util.Collection; 
import java.util.Collections; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author reegan 
*/ 
public class SwapNode extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     VBox root = new VBox(20); 
     /* Thid Part Swap Children of Node */ 
     Pane pane = view(); 
     ObservableList<Node> workingCollection = FXCollections.observableArrayList(pane.getChildren()); 
     Collections.swap(workingCollection, 0, 1); 
     pane.getChildren().setAll(workingCollection); 

     root.getChildren().addAll(view(),pane); 

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

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

    /** 
    * The main() method is ignored in correctly deployed JavaFX application. 
    * main() serves only as fallback in case the application can not be 
    * launched through deployment artifacts, e.g., in IDEs with limited FX 
    * support. NetBeans ignores main(). 
    * 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public Pane view() { 
     HBox pane = new HBox(10); 
     Button button = new Button("Hello"); 
     TextField field = new TextField("World"); 
     pane.getChildren().addAll(button,field); 
     return pane; 
    } 
} 
+0

Stellen Sie sicher, Platform.runLater() zu verwenden, wenn Sie den Code von außerhalb JavaFX-Thread ausführen! – klonq

19

Sie das Kind von

childNode.toFront(); 
childNode.toBack(); 
in der Kinder-Liste des Parent bewegen kann
+1

Bei der Verwendung von toFront() oder Toback(), Sie Vielleicht möchte ich beides ausprobieren, als ich versucht habe, auf einer Schaltfläche innerhalb einer HBoxFront() und diese rechts neben dem Label in der HBox platziert. Dieses Verhalten war für mich kontraintuitiv – amartin7211