是否可以在JavaFX2子列表中更改节点的顺序?我尝试set()
和Collections.swap()
然后在IllegalArgumentException
中抛出Parent
,因为在某些点上,子列表在两个位置包含相同的项目(当节点处于新位置且具有没有从旧位置移除)。父内部有一些标志,JavaFX在toFront()
和toBack()
内部使用这些标志来防止异常,但无法从外部访问它们。
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)
答案 0 :(得分:21)
您可以通过
移动父级子项列表中的子项childNode.toFront();
childNode.toBack();
答案 1 :(得分:9)
ObservableList<Node> 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<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;
}
}