Предметы заменяют, но не просят - PullRequest
0 голосов
/ 13 октября 2018

Я работаю над маленькой игрой.Поэтому я создаю игровой интерфейс (фонтаны, пистолет, холст, который я использую в качестве игрового пространства, и интерфейс, которым пользователь может управлять - пистолет).Я помещаю различные элементы в окно, и есть моя проблема.Когда я выполняю свой код, все удачно размещается, но как только я использую одну из кнопок (кнопки в обоих кодах) или ползунок (второй код), ползунок и кнопка огня заменяются.И я не понимаю, почему, потому что я никогда не спрашивал это перераспределение в моем коде.Кроме того, когда предметы перемещаются, я не могу использовать любые другие предметы, кроме кнопки огня и ползунка.Вот скриншоты того, что у меня есть до использования кнопки (первый снимок экрана) (это также, как я хочу, чтобы интерфейс был), а второй снимок экрана показывает, что у меня есть перераспределение.

Как это выглядит, когда яничего не использовать.

Как это выглядит при использовании кнопки или ползунка.

Main.java:

package application;

import bureaux.Bureau;
import canons.Canon;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Main extends Application{
    private StackPane root, rootBureau;
    private Scene scene;
    private Stage stage;
    private Text joueur;
    private Button menu, musique, ajoutJoueur;
    private FlowPane rootJeu;
    private Bureau bureauJoueur;
    private ToolBar toolBar;
    private Canon canonJoueur;

    @Override
    public void start(Stage primaryStage) throws IOException {
        getRoot();
        getScene();
        stage = primaryStage;

        creerInterface();

        stage.setTitle("Mad Java Guns");
        stage.setResizable(false);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public void creerInterface(String mode) { // creating the gamespace and the objects that the user need to play
        getToolBar().getItems().addAll(getMusique(), getAjoutJoueur());
        getRootBureau().getChildren().add(getBureauJoueur());
        getRootJeu().getChildren().add(getCanonJoueur());
        getRoot().getChildren().addAll(getToolBar(), getJoueur(), getRootBureau(), getRootJeu());
    }

    // Getters
    public StackPane getRoot() {
        if(root == null) {
            root = new StackPane();
        }
        return root;
    }

    public Scene getScene() {
        if(scene == null) {
            scene = new Scene(root,1000,800);
        }
        return scene;
    }

    public Text getJoueur() { // gamespace
        if(joueur == null) {
            joueur = new Text("Espace de jeu");
            joueur.setFont(Font.font("Arial", 20));
            joueur.setTranslateY(120);
        }
        return joueur;
    }

    public ToolBar getToolBar() {
        if(toolBar == null) {
            toolBar = new ToolBar();
            toolBar.setTranslateY(122);
            toolBar.setTranslateX(3);
            toolBar.setStyle("-fx-background-color: transparent");
        }
        return toolBar;
    }

    public Button getMusique() { // button too change the music in game
        if (musique == null) {
            musique = new Button("Musique");
            musique.setOnMouseClicked(e -> {
                System.out.println("musique"); // not coded yet
            });
            musique.setFocusTraversable(false);
        }
        return musique;
    }

    public Button getAjoutJoueur() { // add players in the game
        if(ajoutJoueur == null) {
            ajoutJoueur = new Button("Ajouter un joueur");
            ajoutJoueur.setOnMouseClicked(e -> {
                System.out.println("ajoutJoueur"); //not coded yet
            });
            ajoutJoueur.setFocusTraversable(false);
        }
        return ajoutJoueur;
    }

    public StackPane getRootBureau() { // pane where the user's interface will be placed
        if(rootBureau == null) {
            rootBureau = new StackPane();
            rootBureau.setStyle("-fx-background-color: lightgrey");
            rootBureau.setMaxSize(990, 250);
            rootBureau.setTranslateY(270);
        }
        return rootBureau;
    }

    public Bureau getBureauJoueur() { // user's interface
        if(bureauJoueur == null) {
            bureauJoueur = new Bureau("Billy", getCanonJoueur());
        }
        return bureauJoueur;
    }
}

КлассBureau.java:

package bureaux;

import canons.Canon;
import javafx.geometry.Orientation;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;

public class Bureau extends Parent {
    private Slider sliderCanon;
    private HBox boxPrincipale;
    private VBox boxControlesCanon;
    private Button feu;

    public Bureau(String nom, Canon canon) {
        getBoxControlesCanon().getChildren().addAll(getSliderCanon(), getFeu());
        getBoxPrincipale().getChildren().add(getBoxControlesCanon());

        this.setTranslateX(-480); // placing the boxes
        this.setTranslateY(-95);
        this.getChildren().add(getBoxPrincipale());
    }

    //Getteurs
    public HBox getBoxPrincipale() {
        if(boxPrincipale == null) { // return a HBox which countains the VBox (next function)
                                // and other elements which aren't created yet.
            boxPrincipale = new HBox();
        }
        return boxPrincipale;
    }

    public VBox getBoxControlesCanon() { // return a VBox which countains the controls of the gun 
                                    //(gun not showed in the code, doesn't concern the problem)
        if(boxControlesCanon == null) {
            boxControlesCanon = new VBox();
            boxControlesCanon.setSpacing(20);
        }
        return boxControlesCanon;
    }

    public Slider getSliderCanon() { //slider to orient the gun (gun not showed in the code, doesn't concern the problem)
        if(sliderCanon == null) {
            sliderCanon = new Slider(0, 360, 0);
            sliderCanon.setOrientation(Orientation.VERTICAL);
            sliderCanon.valueProperty().addListener(e -> {
                System.out.println(sliderCanon.getValue());
            });
            sliderCanon.setShowTickMarks(true);
            sliderCanon.setShowTickLabels(true);
            sliderCanon.setMajorTickUnit(90f);
        }
        return sliderCanon;
    }

    public Button getFeu() { // fire button
        if(feu == null) {
            feu = new Button("Feu");
            feu.setOnMouseClicked(e -> {
                System.out.println("Feu");
            });
            feu.setFocusTraversable(false);
        }
        return feu;
    }
}

Пожалуйста, запросите дополнительную информацию, если это необходимо.Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: извините за невежливость в верхней части этого текста, я имел обыкновение редактировать его и добавить «Привет», но он просто не хочет показывать это: /

1 Ответ

0 голосов
/ 15 октября 2018

Вы используете Bureau extends Parent.Вам нужно быть более конкретным и использовать узлы, которые будут давать нужный вам результат.

Попробуйте что-то вроде Bureau extends HBox.Тогда

getBoxControlesCanon().getChildren().add(new VBox(getSliderCanon(), getFeu()));

Чтобы получить выравнивание по левому краю, вам может потребоваться сделать что-то вроде

getBoxControlesCanon().getChildren().addAll(new VBox(getSliderCanon(), getFeu()), someOtherNode);
HBox.setHGrow(someOtherNode, Priority.ALWAYS);

Если вы посмотрите на Родитель по сравнению с VBox , вы увидите, что Parent не описывает, как будут расположены дочерние узлы.Многие узлы, являющиеся подклассом Parent, описывают, как будут размещаться их дочерние узлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...