2013-07-20 11 views
11

Czy można zmienić kolejność węzłów na liście dzieci JavaFX2? Próbowałem jednak set() i Collections.swap() jednak oba rzut IllegalArgumentException w Parent jak w pewnym momencie lista dzieci zawiera ten sam element w dwóch pozycjach (gdy węzeł jest w nowej pozycji i nie został usunięty ze starej pozycji). Wewnątrz Parent znajdują się flagi, których JavaFX używa internaly w toFront() i toBack(), co zapobiega wyjątkowi, jednak nie ma sposobu na dostęp do nich z zewnątrz.Jak zmienić kolejność dzieci w 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) 

Odpowiedz

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

Patrz ten kod:

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

Upewnij się również, czy używasz Platform.runLater(), jeśli wykonywałeś kod spoza wątku JavaFX! – klonq

19

Można przesunąć dziecko w liście dzieci rodzica przez

childNode.toFront(); 
childNode.toBack(); 
+1

W przypadku korzystania toFront() lub Toback(), ci może próbować wypróbować obu, kiedy próbowałem doFront() na przycisku w HBox i to umieściło to na prawo od Etykiety w HBox. To zachowanie było dla mnie sprzeczne z intuicją. – amartin7211

Powiązane problemy