2017-05-16 3 views
0

JavaFXアプリケーションでシーンを切り替える際に問題があります。 addingButtonをクリックしてメインシーンから2番目のシーン(シーンを追加)にシーンを変更できますが、すでにシーンを追加しているときに、goBackButtonをクリックするとメインシーンプログラムの2番目のシーンが切り替わります。JavaFX - シーンを切り替えましたが、戻れません

これは、メインシーン

package com.company.gui; 


import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 

public class GUIMainScene 
{ 
    static VBox layout = new VBox(); 
    static Label label = new Label(); 
    static Button addingButton = new Button(); 
    static Button deletingButton = new Button(); 
    static Button stuffButton = new Button(); 


public static Scene setScene() 
{ 
    setLabel(); 
    setButtons(); 
    setLayout(); 
    return new Scene(layout); 
} 


private static void setLabel() 
{ 
    label.setText("Welcome in our dog shelter!"); 
    label.setPrefSize(400, 80); 
    label.setAlignment(Pos.CENTER); 
    label.setFont(new Font("Cambria", 24)); 
} 

private static void setButtons() 
{ 
    setAddingButton(); 
    setDeletingButton(); 
    setStuffButton(); 
} 

private static void setLayout() 
{ 
    layout.getChildren().addAll(label, addingButton, deletingButton, stuffButton); 
    layout.setAlignment(Pos.CENTER); 
    layout.setSpacing(40); 
} 

private static void setAddingButton() 
{ 
    addingButton.setText("Give us a dog"); 
    addingButton = setButtonSize(addingButton); 
    addingButton.setOnAction(e -> GUIScenesManager.switchScene(GUIAddingScene.setScene())); 

} 

private static void setDeletingButton() 
{ 
    deletingButton.setText("Get a dog"); 
    deletingButton = setButtonSize(deletingButton); 

} 

private static void setStuffButton() 
{ 
    stuffButton.setText("Only for stuff!"); 
    stuffButton = setButtonSize(stuffButton); 
} 

private static Button setButtonSize(Button button) 
{ 
    button.setPrefSize(400, 120); 
    return button; 
} 
} 

これはこれは

package com.company.gui; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Font; public class GUIAddingScene { static Label titleLabel = new Label(); static TextField nameTextField = new TextField(); static TextField ageTextField = new TextField(); static TextField healthTextField = new TextField(); static Button okButton = new Button(); static Button goBackButton = new Button(); static HBox topLayout = new HBox(); static VBox centerLayout = new VBox(); static HBox bottomLayout = new HBox(); static BorderPane mainLayout = new BorderPane(); static String name; static int age; static String health; public static Scene setScene() { setLabel(); setTextFields(); setButtons(); setLayout(); return new Scene(mainLayout); } private static void setLabel() { titleLabel.setText("Please describe your dog"); titleLabel.setPrefSize(400, 80); titleLabel.setAlignment(Pos.CENTER); titleLabel.setFont(new Font("Cambria", 24)); } private static void setTextFields() { setNameTextField(); setAgeTextField(); setHealthTextField(); } private static void setNameTextField() { nameTextField.setPromptText("name"); } private static void setAgeTextField() { ageTextField.setPromptText("age"); } private static void setHealthTextField() { healthTextField.setPromptText("health status"); } private static void setButtons() { setOkButton(); setGoBackButton(); } private static void setOkButton() { okButton.setText("Ok"); okButton = setButtonSize(okButton); } private static void setGoBackButton() { goBackButton.setText("Return"); goBackButton = setButtonSize(goBackButton); goBackButton.setOnAction(e -> GUIScenesManager.switchScene(GUIMainScene.setScene())); } private static Button setButtonSize(Button button) { button.setPrefSize(100, 60); return button; } private static void setLayout() { setTopLayout(); setCenterLayout(); setBottomLayout(); setMainLayout(); } private static void setTopLayout() { topLayout.getChildren().add(titleLabel); topLayout.setAlignment(Pos.CENTER); } private static void setCenterLayout() { centerLayout.getChildren().addAll(nameTextField, ageTextField, healthTextField); centerLayout.setAlignment(Pos.CENTER); } private static void setBottomLayout() { bottomLayout.getChildren().addAll(okButton, goBackButton); } private static void setMainLayout() { mainLayout.setTop(topLayout); mainLayout.setCenter(centerLayout); mainLayout.setBottom(bottomLayout); } } 
addingScene

と呼ばれる私の2番目のシーンであるGUIScenesManager

package com.company.gui; 


import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class GUIScenesManager 
{ 
    private static Stage stage; 

    public static void start(Stage firstStage, Scene firstScene) 
    { 
     stage = firstStage; 
     stage.setScene(firstScene); 
     stage.show(); 
    } 

    public static void switchScene(Scene scene) 
    { 
     stage.setScene(scene); 
    } 
} 

です

は、このエラーは、私は、例外がクリアされている

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = [email protected][styleClass=root] 
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454) 
    at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234) 
    at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:103) 
    at com.company.gui.GUIMainScene.setLayout(GUIMainScene.java:47) 
    at com.company.gui.GUIMainScene.setScene(GUIMainScene.java:25) 
    at com.company.gui.GUIAddingScene.lambda$setGoBackButton$0(GUIAddingScene.java:93) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Node.fireEvent(Node.java:8413) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    at java.lang.Thread.run(Thread.java:748) 

答えて

0

を取得する:あなたが同じノードにあなたが順番にgetChildren().addAll(yourElems...)を呼び出しsetLayout()呼び出すたびに追加しようとしているduplicate children added

。あなたのsetScene()メソッドから呼び出されます。

次のオプションがあります。

  • 削除し、再度追加子供あなたは
  • swap scenes
+0

さて、私は私のミスを理解しています。スワッピングシーンで子供を取り除いて再追加する方法を教えてください。コード内で何を変更する必要がありますか?私はまだ夢中です:/ – konrad2645

+0

あなたは要素の追加方法と同様に削除できます。だから 'layout.getChildren()。removeAll(elems ...)'。一旦取り除かれると、それらをもう一度追加することができます。あなたがそれらを隠そうとしている場合は、子を反復して 'elem.setVisible(boolean) 'を呼び出すことができます – steven35

+0

私はあなたの提案をしましたが、不運にもうまくいきませんでした。次のエラーが表示されました:https://drive.google.com/open?id=0BwgBzZdoBVhtMFktcXV4S1RWVEU – konrad2645

0

画面

  • 非表示と表示コンテナを交換しているとき、私はJavaFXのに新たなんだがエラーを見てください:

    duplicate children added

    2回目のクリックでノードを再設定し、ノードを親に追加します。それがエラーです。

    一度親にあなたのノードを入れて(例えば、静的なブロックに。。):

    static { 
        setLayout(); 
    } 
    
  • 関連する問題