How to fix JavaFX alignment problem when grouping elements?

51 Views Asked by At

We are making a Pentomino/Tetris game with Java and the back end just finished. However, on the front end, we are having some issues. For example, the alignment seems nice when I first select the pentominos or parcels. But when I also select the algorithm to work on, the pentominos/parcels automatically align lower. I don't know why and how to fix the problem but it should be something about the group system. I am providing you both the nice version and the version after selecting the algorithm. without selecting the alorithm after selecting the algorithm. I am also providing you the code so that you can look into it. Thanks.


import java.io.FileInputStream;
import java.io.FileNotFoundException;

import Phase3.Data3D.MyData;
import Phase3.MyBackend.MySolvers.DLXSolver;
import Phase3.MyBackend.MySolvers.Greedy;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.Line;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;

public class MyScene {

    private double mouseX, mouseY;
    Scene scene;
    BorderPane borderPane;
    BorderPane mainLayout;
    String algo;
    private boolean dlxSelected = true;
    private String type = "Pe";
    Group group;
    int size = 20;

    Group pentParcels;
    Group algoGroup;

    public MyScene() {

        intGroup();
        pentParcels = new Group();
        algoGroup = new Group();

        borderPane = initBorderPane();

        initVBoxAlgo();
        initLabel();

        initMainLayout();
        scene = new Scene(mainLayout, 1000, 700, Color.BLUEVIOLET);

        initButtEng();

        mousy();

    }

    private void intGroup() {
        group = new Group();

        group.setTranslateX(20);
        group.setTranslateY(10);
        group.setTranslateZ(90);

        Scale scale = new Scale(0.8, 0.8, 0.8);
        group.getTransforms().add(scale);

    }

    private void initButtEng() {
        Group buttonsEng = new Group();
        Button but1 = new Button("Search");

        buttonsEng.getChildren().add(but1);
        borderPane.getChildren().addAll(buttonsEng);
        buttonsEng.setTranslateY(630);
        buttonsEng.setTranslateX(130);

        but1.setOnAction(e -> {
            if (dlxSelected) {
                DLXSolver solver;
                if (type.equals("P"))
                    solver = new DLXSolver(type, MyData.indecesParc);
                else
                    solver = new DLXSolver("Pe", MyData.indecesPent);
                solver.solve();
                int[][][] solution = solver.bestSolution();
                initCube(solution);
                System.out.println("Finished");
                solver.getText();
            } else {

                Greedy greedy = new Greedy(type);
                greedy.solve();
                initCube(greedy.getContainer().getField());
                System.out.println(greedy.getContainer().totalValue());
            }

        });
    }

    private void initMainLayout() {
        mainLayout = new BorderPane();

        mainLayout.setRight(borderPane);
        mainLayout.setCenter(group);
        BackgroundFill backgroundFill = new BackgroundFill(Color.AQUA, null, null);
        Background background = new Background(backgroundFill);
        mainLayout.setBackground(background);
    }

    private HBox initValuesBoxes() {
        HBox valuesBoxes = new HBox(10);
        TextField valueField1 = new TextField();
        TextField valueField2 = new TextField();
        TextField valueField3 = new TextField();

        valuesBoxes.getChildren().addAll(valueField1, valueField2, valueField3);
        valuesBoxes.setTranslateY(-200);
        borderPane.setBottom(valuesBoxes);
        return valuesBoxes;
    }

    private void initLabel() {
        Label Title = new Label("KNAPSACK PROBLEM");

        Title.setTranslateX(-80);
        Title.setStyle(
                "-fx-font-family: 'Helvetica Bold'; -fx-font-size: 25; -fx-text-fill: white; -fx-font-weight: bold; -fx-letter-spacing: 0.1em;");
        borderPane.setRight(Title);

    }

    private void initVBoxAlgo() {
        ComboBox<String> botList = initAlgoList();

        ComboBox<String> shapeList = initShapList();

        botList.setTranslateX(200);
        shapeList.setTranslateX(0);

        botList.setTranslateY(40);

        algoGroup.setTranslateX(200);
        algoGroup.setTranslateY(80);

        pentParcels.setTranslateX(0);
        pentParcels.setTranslateY(0);

        VBox vbox = new VBox(15);
        vbox.getChildren().addAll(botList, shapeList, algoGroup, pentParcels);

        vbox.setTranslateY(80);
        vbox.setTranslateX(50);

        vbox.setPrefWidth(150);
        borderPane.setLeft(vbox);

        shapeList.setOnAction(e -> {
            String selectedShape = shapeList.getValue();

            if ("Pentominos".equals(selectedShape)) {
                type = "Pe";
                drawPentominos();
            } else if ("Parcels".equals(selectedShape)) {
                type = "P";
                drawParcels();
            }
        });

        botList.setOnAction(e -> {
            String selectedShape = botList.getValue();
            if (selectedShape.equals("Greedy")) {
                dlxSelected = false;
                drawGreed();
            } else if (selectedShape.equals("Dancing Links")) {
                dlxSelected = true;
                drawDancing();
            }
        });
    }

    private ComboBox<String> initShapList() {
        ObservableList<String> options2 = FXCollections.observableArrayList("Pentominos", "Parcels");
        ComboBox<String> shapeList = new ComboBox<>(options2);
        // shapeList.setStyle("-fx-font-family: 'Helvetica'; -fx-font-size: 16;
        // FontWieght.EXTRA_BOLD; ");
        shapeList.setValue("Which Shapes?");
        shapeList.setPrefWidth(200);
        return shapeList;
    }

    private ComboBox<String> initAlgoList() {
        ObservableList<String> options1 = FXCollections.observableArrayList("Dancing Links", "Greedy");
        ComboBox<String> botList = new ComboBox<>(options1);
        // botList.setStyle("-fx-font-family: 'Helvetica'; -fx-font-size: 16;
        // FontWieght.EXTRA_BOLD; ");
        botList.setValue("Which Algorithm?");
        botList.setPrefWidth(200);
        return botList;
    }

    private BorderPane initBorderPane() {
        BorderPane borderPane = new BorderPane();
        borderPane.setStyle("-fx-background-color: navy; -fx-border-color: black; -fx-border-width: 2px; ");
        borderPane.setPrefWidth(250);
        return borderPane;
    }

    private void mousy() {
        group.setOnMousePressed(event -> {
            mouseX = event.getSceneX();
            mouseY = event.getSceneY();
        });

        group.setOnMouseDragged(event -> {
            double deltaX = event.getSceneX() - mouseX;
            double deltaY = event.getSceneY() - mouseY;

            Point3D center = calculateCenter(group);

            Rotate rotateX = new Rotate(-deltaY, center.getX(), center.getY(), center.getZ(), Rotate.X_AXIS);
            Rotate rotateY = new Rotate(deltaX, center.getX(), center.getY(), center.getZ(), Rotate.Y_AXIS);

            group.getTransforms().addAll(rotateX, rotateY);

            mouseX = event.getSceneX();
            mouseY = event.getSceneY();
        });
    }

    private Point3D calculateCenter(Group group) {
        double totalX = 0, totalY = 0, totalZ = 0;
        int count = 0;

        for (Node node : group.getChildren()) {
            if (node instanceof Box) {
                Box box = (Box) node;
                totalX += box.getTranslateX();
                totalY += box.getTranslateY();
                totalZ += box.getTranslateZ();
                count++;
            }
        }

        return new Point3D(totalX / count, totalY / count, totalZ / count);
    }

    public void initCube(int[][][] container) {

        group.getChildren().clear();

        for (int i = 0; i < container.length; i++) {
            for (int j = 0; j < container[0].length; j++) {
                for (int k = 0; k < container[0][0].length; k++) {
                    if (container[i][j][k] == 0)
                        continue;
                    Box box = new Box(size, size, size);
                    /*
                     * After this line, I changed to code for it to work properly whenever the
                     * method gets changed.
                     */
                    box.setTranslateX(i * size - container.length * size / 2.0);
                    box.setTranslateY(j * size - container[0].length * size / 2.0);
                    box.setTranslateZ(k * size - container[0][0].length * size / 2.0);
                    PhongMaterial material = new PhongMaterial();
                    material.setDiffuseColor(getColor(container[i][j][k]));
                    material.setSpecularPower(10);
                    material.setSpecularColor(getColor(container[i][j][k]));
                    box.setMaterial(material);

                    group.getChildren().add(box);
                }
            }
        }

    }

    private Color getColor(int i) {
        if (i == 1) {
            return Color.ORANGE;
        } else if (i == 2) {
            return Color.YELLOW;
        } else if (i == 3) {
            return Color.GREEN;
        } else if (i == 4) {
            return Color.SEAGREEN;
        } else if (i == 5) {
            return Color.BLUE;
        } else if (i == 6) {
            return Color.RED;
        } else
            return Color.GRAY;
    }

    String[] pents = new String[] { "L", "P", "T" };

    void drawPentominos() {

        try {

            pentParcels.getChildren().clear();
            for (int i = 0; i < pents.length; i++) {

                Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/" + pents[i] + ".png"));
                ImageView view = new ImageView(image);

                // Set the size
                view.setFitHeight(120);
                view.setFitWidth(120);

                // Preserve the aspect ratio
                view.setPreserveRatio(true);

                // Set the position
                if (i == 0) {
                    view.setX(50);
                    view.setY(0);

                } else if (i == 1) {
                    view.setX(100);
                    view.setY(0);
                } else if (i == 2) {
                    view.setX(50);
                    view.setY(55);
                }

                pentParcels.getChildren().add(view);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    String[] parcels = new String[] { "A", "B", "C" };

    void drawParcels() {
        try {

            pentParcels.getChildren().clear();
            for (int i = 0; i < parcels.length; i++) {

                Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/" + parcels[i] + ".png"));
                ImageView view = new ImageView(image);

                // Set the size
                view.setFitHeight(100);
                view.setFitWidth(100);

                // Preserve the aspect ratio
                view.setPreserveRatio(true);

                // Set the position

                if (i == 0) {
                    view.setX(20);
                    view.setY(0);

                } else if (i == 1) {
                    view.setX(60);
                    view.setY(8);
                } else if (i == 2) {
                    view.setX(20);
                    view.setY(76);
                }

                pentParcels.getChildren().add(view);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    void drawGreed() {

        try {

            algoGroup.getChildren().clear();

            Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/greed.jpg"));
            ImageView view = new ImageView(image);

            view.setX(110);
            view.setY(0);
            view.setFitHeight(70);
            view.setFitWidth(70);

            algoGroup.getChildren().add(view);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    void drawDancing() {
        try {

            algoGroup.getChildren().clear();

            Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/dancing.jpg"));
            ImageView view = new ImageView(image);

            view.setX(110);
            view.setY(0);
            view.setFitHeight(70);
            view.setFitWidth(70);

            algoGroup.getChildren().add(view);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Scene getScene() {
        return scene;
    }
}
0

There are 0 best solutions below