如何在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();