如何在javafx中堆叠形状
我想用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
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);
}
}