如何在JavaFX中更改子项的顺序

是否可以在JavaFX2子列表中更改节点的顺序? 我尝试了set()Collections.swap()但是两者都在Parent抛出IllegalArgumentException ,因为在某些点上,子列表在两个位置包含相同的项(当节点处于新位置且尚未从旧位置移除时)。 在Parent中有一些标志,JavaFX在toFront()toBack()使用toFront()来防止exception,但是没有办法从外部访问它们。

 java.lang.IllegalArgumentException: Children: duplicate children added: parent = HBox@1424bf0 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) 

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

请参阅此代码:

 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 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, eg, 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; } } 

您可以将子项移动到父项的子项列表中

 childNode.toFront(); childNode.toBack();