如何在javafx中堆叠形状

如何在javafx中堆叠形状,java,javafx,stack,Java,Javafx,Stack,我想用JavaFX实现一个堆栈,我已经解决了大部分问题。唯一的问题是我想在一个矩形内显示堆栈的值,并将每个矩形与其对应的值一个接一个地堆叠,但我不知道如何做到这一点。 这是到目前为止我的代码 import DataStructuresImp.Stack; import javafx.application.Application; import javafx.collections.ObservableList; import javafx.geometry.Pos; import javafx

我想用JavaFX实现一个堆栈,我已经解决了大部分问题。唯一的问题是我想在一个矩形内显示堆栈的值,并将每个矩形与其对应的值一个接一个地堆叠,但我不知道如何做到这一点。 这是到目前为止我的代码

import DataStructuresImp.Stack;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.ArrayList;

public class StudyJavaFx extends Application {
    Pane pane = new Pane();
    Stack<String> stack = new Stack<>();
    private double vGap = 50;


    @Override
    public void start(Stage primaryStage){
        TextField textField = new TextField();
        Rectangle rectangle = new Rectangle(25,30,60,30);
        rectangle.setStroke(Color.BLACK);
        rectangle.setFill(Color.WHITE);
        Button insert = new Button("Insert");
        Button delete = new Button("Delete");
        java.util.ArrayList list = new ArrayList();

        HBox hBox = new HBox();
        hBox.getChildren().addAll(insert,delete,textField);
        hBox.setAlignment(Pos.CENTER);

        VBox vBox = new VBox();
        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(pane);
        borderPane.setBottom(hBox);
        borderPane.setTop(vBox);

        BorderPane.setAlignment(hBox,Pos.CENTER);

        Scene scene = new Scene(borderPane,500,500);
        primaryStage.setScene(scene);
        primaryStage.setTitle("value in rectangle");
        primaryStage.show();


        insert.setOnAction(e-> {
            String value = textField.getText();
            int x = 180;
            int y = 475;

                if (isBlank(value)) {
                    vBox.getChildren().clear();
                    vBox.getChildren().add(new Text(20, 20, "Please Enter value!"));
                } else {
                    if (!stack.inside(value)) {
                        stack.push(value);
                        vBox.getChildren().clear();
                        for (int i =1;i<stack.size();i++){
                            displayStack(x, y*i, vGap);
                        }

                        System.out.println(stack);

                    } else {
                        vBox.getChildren().clear();
                        vBox.getChildren().add(new Text(20, 20, "Value is already present in stack!"));
                    }
                    if (stack.isEmpty())
                        return;
                }
        });
    }

    public void displayStack(){
            displayStack(180,475,vGap);

    }

    public void displayStack( double x, double y, double vGap){
       Rectangle rectangle = new Rectangle(x ,y - vGap ,150,20);
        rectangle.setFill(Color.WHITE);
        rectangle.setStroke(Color.BLACK);
        pane.getChildren().addAll(rectangle, new Text(x+65,y-35,stack.peek()));
    }

    public Boolean isBlank(String value){
      if (value!=null && !value.isEmpty() && !value.trim().isEmpty()){
          return false;
      } else return true;
    }

    /*public static void main(String[]args){
        StudyJavaFx object = new StudyJavaFx();
        System.out.println(object.isBlank("  "));
    }*/


}
导入DataStructuresImp.Stack;
导入javafx.application.application;
导入javafx.collections.ObservableList;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Polygon;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.text;
导入javafx.stage.stage;
导入java.util.ArrayList;
公共类StudyJavaFx扩展了应用程序{
窗格=新窗格();
堆栈=新堆栈();
私人双vGap=50;
@凌驾
公共无效开始(阶段primaryStage){
TextField TextField=新的TextField();
矩形矩形=新矩形(25,30,60,30);
矩形。设定行程(颜色。黑色);
矩形。设置填充(颜色。白色);
按钮插入=新按钮(“插入”);
按钮删除=新按钮(“删除”);
java.util.ArrayList=新建ArrayList();
HBox HBox=新的HBox();
hBox.getChildren().addAll(插入、删除、文本字段);
hBox.设置校准(位置中心);
VBox VBox=新的VBox();
BorderPane BorderPane=新的BorderPane();
边框窗格。设置中心(窗格);
borderPane.setBottom(hBox);
边框窗格.setTop(vBox);
边框窗格。设置对齐(hBox,位置中心);
场景=新场景(边框窗格,500500);
初级阶段。场景(场景);
setTitle(“矩形中的值”);
primaryStage.show();
插入.设置操作(e->{
字符串值=textField.getText();
int x=180;
int y=475;
如果(为空(值)){
vBox.getChildren().clear();
添加(新文本(20,20,“请输入值!”);
}否则{
如果(!堆栈内部(值)){
堆栈推送(值);
vBox.getChildren().clear();

对于(int i=1;我也看到了。首先,循环从1开始计数,而不是0。其次,堆栈中的每个元素的y坐标增加475,这太多了(如果扩展窗口足够大,可能会看到两个元素)。第三,每次调用
peek()
,因此每次都会看到堆栈的顶部元素(因此每次都显示相同的元素)。堆栈的典型界面不允许您查看除当前顶部元素以外的任何内容;如果您的UI希望显示所有元素,则需要清空堆栈,或者对整个基础列表具有“特权”访问权。
package DataStructuresImp;

public class Stack<E> {
    private java.util.ArrayList<E> list = new java.util.ArrayList<>();
    public void push(E e){
        list.add(e);
    }

    public E pop(){
        if (list.isEmpty()){
            return null;
        }
        E top = list.get(list.size() - 1);
        list.remove(list.size()- 1);
        return top;
    }

    public E peek(){
        if (list.isEmpty()){
            return null;
        }
        E top  = list.get(list.size()-1);
        return top;
    }

    public boolean inside(E value){
        return list.contains(value);
    }

    public int size(){
        return list.size();
    }


    public boolean isEmpty(){
        return list.isEmpty();
    }

    public String toString(){
        return "Stack: " + list.toString();
    }


    public static void main(String[] args){
        Stack<Integer> list = new Stack<>();

        list.push(5);
        list.push(7);
        list.push(4);
        list.push(9);

        for (int i = 0; i<list.size();i++)
        System.out.println(list);

        System.out.println("Is stack empty: " + list.isEmpty());


        System.out.println("Stack size " +list.size());
        list.pop();
        list.pop();
        System.out.println("is Stack empty: " + list.isEmpty());
        System.out.println(list.size());
        System.out.println("After pop" +list);


    }

}