Всякий раз, когда я использую объект Text в JavaFX, все объекты перекрывают текст, даже последующие текстовые объекты - PullRequest
0 голосов
/ 14 июля 2020

Обновление: я использую JavaFX 13

Эта проблема возникает во всех моих программах JavaFX, но это только один пример. Предполагается, что пользователь сможет выбрать параметры для собственного молочного коктейля, а затем получить квитанцию ​​при оформлении заказа. Все ссылки на объекты и MVC работают как положено, но при отображении информации с использованием текстовых объектов (javafx.scene.text.Text) они перекрываются другими объектами вокруг них. На втором и третьем изображениях обведены вхождения.

Первый запуск программы. Первое изображение

Вот код для текстовой панели на втором изображении: После добавления нескольких выделений. Второе изображение

import Controllers.Controller;
import Entities.Milkshake;
import Interfaces.Observer;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;

import java.util.ArrayList;;

public class TextSummaryView extends AnchorPane implements Observer<Milkshake> {
    private Milkshake model;
    private Controller controller;
    private VBox iceCreamOptions;
    private VBox toppingOptions;
    private Text totalCost;

    private final double minHeight = 100.0;
    private final double minWidth = 50.0;


    public TextSummaryView() {
        super();

        iceCreamOptions = new VBox();
        toppingOptions = new VBox();
        totalCost = new Text("$0.00");
        Button checkout = new Button("Checkout");
        checkout.setOnAction(e -> controller.checkout());

        Text iceCreamText = new Text("Click '-' to remove\nCurrent Ice Cream Selections:");
        Text toppingText = new Text("Current Topping Selections");

        iceCreamOptions.getChildren().add(iceCreamText);
        toppingOptions.getChildren().add(toppingText);

        this.getChildren().addAll(checkout, iceCreamOptions, toppingOptions, totalCost);

        // Setting position of elements
        setBottomAnchor(checkout, this.getHeight()-5.0);
        setRightAnchor(checkout, this.getWidth()-5.0);

        setLeftAnchor(totalCost, 5.0);
        setBottomAnchor(totalCost, this.getHeight()-5.0);

        setTopAnchor(iceCreamOptions, 5.0);
        setLeftAnchor(iceCreamOptions, 5.0);

        setTopAnchor(toppingOptions, Math.max(40.0, iceCreamOptions.getHeight() + 10.0));
        setLeftAnchor(toppingOptions, 5.0);

        this.setMinHeight(minHeight);
        this.setMinWidth(minWidth);
    }

    /**
     * Sets what the observer will watch
     * @param obs An object that extends the Observable interface
     */
    public void setTarget(Milkshake obs){
        this.model = obs;
    }

    /**
     * Removes the object from target
     */
    public void removeTarget(){
        this.model = null;
    }

    /**
     * Called by observables to update the observer's data
     */
    public void update(){
        this.iceCreamOptions.getChildren().remove(1, this.iceCreamOptions.getChildren().size());
        this.toppingOptions.getChildren().remove(1, this.toppingOptions.getChildren().size());

        // Get Data
        ArrayList<String> iceCreams = model.getIceCreams();
        ArrayList<String> toppings = model.getToppings();

        // Update the ice cream selections
        int iceCreamIndex = 0;

        for (String ic: iceCreams) {
            AnchorPane selection = new AnchorPane();

            Button removeButton = new Button("-");
            Text iceCream = new Text(ic + ":");
            Text cost = new Text("$1.00");

            final int iceIndexFin = iceCreamIndex;

            removeButton.setOnAction(e -> controller.removeIceCream(iceIndexFin));

            selection.getChildren().addAll(removeButton, iceCream, cost);

            setLeftAnchor(removeButton, 5.0);
            setLeftAnchor(iceCream, 50.0);
            setTopAnchor(iceCream, selection.getHeight()/3);
            setLeftAnchor(cost, selection.getWidth()-5.0);
            setTopAnchor(cost, selection.getHeight()/3);

            this.iceCreamOptions.getChildren().add(selection);

            iceCreamIndex ++;
        }

        // Update the topping selections
        int toppingIndex = 0;

        for (String top: toppings) {
            AnchorPane selection = new AnchorPane();

            Button removeButton = new Button("-");
            Text topping = new Text(top + ":");
            Text cost = new Text("$0.50");

            final int topIndexFin = toppingIndex;

            removeButton.setOnAction(e -> controller.removeTopping(topIndexFin));

            selection.getChildren().addAll(removeButton, topping, cost);

            setLeftAnchor(removeButton, 5.0);
            setLeftAnchor(topping, 50.0);
            setTopAnchor(topping, selection.getHeight()/3);
            setLeftAnchor(cost, selection.getWidth()-5.0);
            setTopAnchor(cost, selection.getHeight()/3);

            this.toppingOptions.getChildren().add(selection);
            toppingIndex ++;
        }

        setTopAnchor(iceCreamOptions, 5.0);
        setLeftAnchor(iceCreamOptions, 5.0);

        setTopAnchor(toppingOptions, Math.max(40.0, iceCreamOptions.getHeight() + 10.0));
        setLeftAnchor(toppingOptions, 5.0);

        this.totalCost.setText( "$" + this.model.getCost() + "0");
    }

    public void setController(Controller controller){
        this.controller = controller;
    }
}

Вот код для экрана оформления заказа. Нажатие кнопки оформления заказа. Все это разные текстовые объекты в VBox. Третье изображение

import Entities.Milkshake;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.util.ArrayList;

public class CheckoutView extends Stage {
    VBox root = new VBox();

    public CheckoutView(Milkshake ms) {
        super();

        // Get Data
        ArrayList<String> iceCreams = ms.getIceCreams();
        ArrayList<String> toppings = ms.getToppings();

        // Update the ice cream selections
        int iceCreamIndex = 0;

        for (String ic: iceCreams) {
            AnchorPane selection = new AnchorPane();

            Text iceCream = new Text(ic + ":");
            Text cost = new Text("$1.00");

            final int iceIndexFin = iceCreamIndex;

            selection.getChildren().addAll(iceCream, cost);
            AnchorPane.setLeftAnchor(iceCream, 50.0);
            AnchorPane.setLeftAnchor(cost, this.getWidth()-5.0);

            this.root.getChildren().add(selection);

            iceCreamIndex ++;
        }

        // Update the topping selections
        int toppingIndex = 0;

        for (String top: toppings) {
            AnchorPane selection = new AnchorPane();

            Text topping = new Text(top + ":");
            Text cost = new Text("$0.50");

            selection.getChildren().addAll(topping, cost);

            AnchorPane.setLeftAnchor(topping, 50.0);
            AnchorPane.setLeftAnchor(cost, this.getWidth()-5.0);

            this.root.getChildren().add(selection);
            toppingIndex ++;
        }

        AnchorPane total = new AnchorPane();
        Text costTotal = new Text("$" +ms.getCost() + "0");
        total.getChildren().add(costTotal);
        AnchorPane.setLeftAnchor(total, this.getMaxWidth()-costTotal.getX());

        BorderPane exitOptions = new BorderPane();
        Button pay = new Button("Finish and Pay");
        Button ret = new Button("Return to Order");

        pay.setOnAction(e -> Platform.exit());
        ret.setOnAction(e -> this.close());

        exitOptions.setLeft(ret);
        exitOptions.setRight(pay);

        root.getChildren().add(exitOptions);

        this.setTitle("Checkout");
        this.setScene(new Scene(root));
    }

    public static void checkout(Milkshake ms) {
        CheckoutView check = new CheckoutView(ms);
        check.show();
    }
}

Заранее благодарю за вашу помощь! :)

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