2013-07-20 32 views
11

JavaFX2の子リストでノードの順序を変更できますか?私はset()Collections.swap()を試しましたが、IllegalArgumentExceptionParentに投げ込みました。ある時点では、2つの位置に同じ項目が含まれています(ノードが新しい位置にあり、古い位置から削除されていない場合)。 JavaFXが内部で使用するtoFront()toBack()には、例外を防ぐためのフラグがParent内にありますが、外部からアクセスする方法はありません。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) 

答えて

7
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; 
    } 
} 
+0

また、JavaFXスレッドの外部からコードを実行する場合は、Platform.runLater()を必ず使用してください! – klonq

19

あなたはこのコードを参照してください

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

toFront()またはtoBackを(使用している場合)、あなたは私はHBox内のボタンのtoFront()を試してみると、これをHBoxのLabelの右側に置いてみると、両方を試してみたいかもしれません。この動作は私には逆らっていた – amartin7211

関連する問題