物品被替换但未被询问

时间:2018-10-12 21:22:21

标签: java javafx

我正在做一个小游戏。因此,我创建了游戏界面(计算枪支,用作游戏空间的画布以及供用户控制的接口是枪支)。我将不同的元素放在窗口中,这是我的问题。当我执行代码时,所有位置都很好,但是一旦我使用其中一个按钮(两个代码中的按钮)或滑块(第二个代码),则滑块和触发按钮会自行替换。而且我不明白为什么,因为我从未在代码中要求这种重新分配。另外,当项目重新排列时,除了“启动”按钮和滑块之外,我不能再使用任何其他项目。 这是我使用按钮之前所拥有的屏幕截图(第一个屏幕截图)(这也是我想要界面的样子),第二个屏幕截图显示了我的重新分配。

How it looks when I use nothing.

How it looks when I use a button or the slider.

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

Class 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;
    }
}

如有必要,请询问更多信息。感谢您的帮助。

编辑:对不起,您在此文字上方的不礼貌,我曾对其进行编辑并添加“ Hello”,但它只是不想显示它:/

1 个答案:

答案 0 :(得分:0)

您正在使用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);

如果将Mechanism behind QR code scanning of whatsapp webappParent进行比较,您会发现Parent没有描述子节点的布局方式。许多作为Parent的子类的节点确实描述了如何布置其子节点。