2017-04-18 7 views
0

私は現在、javafxでハノイの塔を作成しようとしています。私は、各VBoxに矩形を適切に積み重ねる方法を少し失っています。以下のコードを実行すると、複数のブロックを同じvboxに移動すると、新しいブロックが下に追加されますが、一番上になければなりません。これを正しく実装するにはどうしたらいいですか?vboxに図形を正しく積み重ねる方法は? JavaFX

ありがとうございます。

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.Paint; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class TowersOfHanoi extends Application { 
Rectangle selectedpiece; 
VBox selectedbox; 
Paint temp; 

public static void main(String[] args){ 
    launch(); 
} 
@Override 
public void start(Stage mainStage) throws Exception { 
    GridPane gp = new GridPane(); 

    //Adding 3 panels 
    VBox panel1 = new VBox(); 
    panel1.setBackground(new Background(new BackgroundFill(Color.LIGHTGREEN, CornerRadii.EMPTY, Insets.EMPTY))); 
    panel1.setAlignment(Pos.BOTTOM_CENTER); 
    panel1.setPrefHeight(980); 
    panel1.setPrefWidth(500); 
    panel1.setSpacing(1); 
    panel1.setPadding(new Insets(0, 20, 10, 20)); 
    panel1.setOnMouseClicked(new panelEventHandler()); 

    VBox panel2 = new VBox(); 
    panel2.setBackground(new Background(new BackgroundFill(Color.LIGHTBLUE, CornerRadii.EMPTY, Insets.EMPTY))); 
    panel2.setAlignment(Pos.BOTTOM_CENTER); 
    panel2.setPrefHeight(500); 
    panel2.setPrefWidth(500); 
    panel2.setSpacing(1); 
    panel2.setPadding(new Insets(0, 20, 10, 20)); 
    panel2.setOnMouseClicked(new panelEventHandler()); 

    VBox panel3 = new VBox(); 
    panel3.setBackground(new Background(new BackgroundFill(Color.LIGHTSALMON, CornerRadii.EMPTY, Insets.EMPTY))); 
    panel3.setAlignment(Pos.BOTTOM_CENTER); 
    panel3.setPrefHeight(500); 
    panel3.setPrefWidth(500); 
    panel3.setSpacing(1); 
    panel3.setPadding(new Insets(0, 20, 10, 20)); 
    panel3.setOnMouseClicked(new panelEventHandler()); 

    //Adding all 4 pieces 
    Rectangle piece1 = new Rectangle(250, 50); 
    piece1.setFill(Color.RED); 
    piece1.setStroke(Color.BLACK); 
    panel1.getChildren().add(piece1); 
    piece1.setOnMouseClicked(new pieceEventHandler()); 

    Rectangle piece2 = new Rectangle(300, 50); 
    piece2.setFill(Color.BLUE); 
    piece2.setStroke(Color.BLACK); 
    panel1.getChildren().add(piece2); 
    piece2.setOnMouseClicked(new pieceEventHandler()); 

    Rectangle piece3 = new Rectangle(350, 50); 
    piece3.setFill(Color.CORAL); 
    piece3.setStroke(Color.BLACK); 
    panel1.getChildren().add(piece3); 
    piece3.setOnMouseClicked(new pieceEventHandler()); 

    Rectangle piece4 = new Rectangle(400, 50); 
    piece4.setFill(Color.MAGENTA); 
    piece4.setStroke(Color.BLACK); 
    panel1.getChildren().add(piece4); 
    piece4.setOnMouseClicked(new pieceEventHandler()); 

    gp.getChildren().add(panel1); 
    gp.getColumnConstraints().add(new ColumnConstraints(500)); 
    GridPane.setColumnIndex(panel1, 0); 
    gp.getChildren().add(panel2); 
    GridPane.setColumnIndex(panel2, 5); 
    gp.getChildren().add(panel3); 
    GridPane.setColumnIndex(panel3, 10); 


    Scene scene = new Scene(gp, 1500, 980); 
    mainStage.setScene(scene); 
    mainStage.show(); 
} 



class panelEventHandler implements EventHandler<MouseEvent>{ 

    @Override 
    public void handle(MouseEvent event) { 

     if(selectedpiece == null){ 
      ; 
     } 
     else{ 
      selectedbox = (VBox)event.getSource(); 
      if(selectedbox.getChildren().contains(selectedpiece)){ 
       ; 
      } 
      else{ 
       VBox parentbox = (VBox) selectedpiece.getParent(); 
       parentbox.getChildren().remove(selectedpiece); 
       selectedbox.getChildren().add(selectedpiece); 
       selectedpiece.setFill(temp); 
       selectedpiece = null; 
       selectedbox = null; 

      } 
     } 
    } 

} 

class pieceEventHandler implements EventHandler<MouseEvent>{ 

    @Override 
    public void handle(MouseEvent event) { 
     if(selectedpiece == null){ 
     selectedpiece = (Rectangle) event.getSource(); 
     temp = selectedpiece.getFill(); 
     selectedpiece.setFill(Color.YELLOW); 
     } 
     else if(selectedpiece == (Rectangle) event.getSource()){ 
      selectedpiece.setFill(temp); 
      selectedpiece = null; 
     } 
     else{ 
      selectedpiece.setFill(temp); 
      selectedpiece = (Rectangle) event.getSource(); 
      temp = selectedpiece.getFill(); 
      selectedpiece.setFill(Color.YELLOW); 
     } 
    } 

} 

}

答えて

1

ただ、ほら、私はそれは簡単だった信じることができない

selectedbox.getChildren().add(0, selectedpiece); 
+0

selectedbox.getChildren().add(selectedpiece); 

を交換してください。どうもありがとうございました! – krambo

+0

@krambo 'ObservableList'は機能が追加された通常の' java.util.List'だけなので、通常の 'List'メソッドのどれかを使うことができます。 –

関連する問題