java 如何在 JavaFX 中更改子项的顺序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17761415/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to change order of children in JavaFX
提问by Mariusz Jamro
Is it possible to change order of Nodes in JavaFX2 children list? I tried set()
and Collections.swap()
however both throw IllegalArgumentException
in Parent
as in some point the children list contains the same item at two positions (when node is at new position and has not been removed from the old position). There are flags inside Parent which JavaFX uses internaly in toFront()
and toBack()
which prevents the exception, however there is no way to access them from outside.
是否可以更改 JavaFX2 子列表中节点的顺序?我尝试过set()
,Collections.swap()
但是两者都投入IllegalArgumentException
,Parent
因为在某些时候,子列表在两个位置包含相同的项目(当节点位于新位置并且尚未从旧位置删除时)。有其内部的JavaFX在使用internaly家长标志toFront()
和toBack()
防止异常,但没有办法从外部访问它们。
java.lang.IllegalArgumentException: Children: duplicate children added: parent = HBox@1424bf0
at javafx.scene.Parent.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)
采纳答案by Reegan Miranda
ObservableList<Node> workingCollection = FXCollections.observableArrayList(pane.getChildren());
Collections.swap(workingCollection, 0, 1);
pane.getChildren().setAll(workingCollection);
Refer to this 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;
}
}
回答by Uluk Biy
You can move the child in the parent's children list by
您可以通过以下方式移动父母的孩子列表中的孩子
childNode.toFront();
childNode.toBack();