如何将 setOnAction 与复选框一起使用?

How to use setOnAction with checkBox?

我正在使用工厂设计模式在 javaFX 中制作披萨订购 GUI,我了解在工厂模式中所有决策都在工厂中进行的事实 class。现在我创建了一些复选框,用户必须从中 select 才能下订单。我如何使用工厂 class 中的 checkbox.isSelected() 来完成它,或者还有其他我遗漏或需要做的事情?

这是 GUI

import java.util.ArrayList;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.ToggleGroup;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class PizzaGUI extends Application {

    static  ArrayList<String> pza_tpg = new ArrayList<String>();
    static  ArrayList<String> pza_tpe = new ArrayList<String>();
    static  ArrayList<String> pza_sze = new ArrayList<String>();
    @Override
    public void start(Stage Stage) {
        
        //pizza toppings    
        pza_tpg.add("Tomatos");
        pza_tpg.add("Green Peppers");
        pza_tpg.add("Black Olives");
        pza_tpg.add("Mushrooms");
        pza_tpg.add("Extra Cheese");
        pza_tpg.add("Pepperoni");
        pza_tpg.add("Sausage");
        
        //pizza size
        pza_sze.add("Small");
        pza_sze.add("Medium");
        pza_sze.add("Large");
        pza_sze.add("Family");
        
        
        //pizza type
        pza_tpe.add("Thin Crust");
        pza_tpe.add("Medium Crust");
        pza_tpe.add("Crust Lover");
        
        
        
        
        Group root = new Group();
        
        
        Label wce= new Label("Welcome to OOPII_PizzaMania");
        wce.setFont(new Font(30));
        wce.setLayoutX(110);
        wce.setLayoutY(80);
        root.getChildren().add(wce);
        
        
        Label tops= new Label("Each Topping: .50");
        tops.setStyle("-fx-font-weight: bold");
        tops.setLayoutX(60);
        tops.setLayoutY(140);
        root.getChildren().add(tops);
        
        
        CheckBox cb1 = new CheckBox("Tomato");  
        CheckBox cb2 = new CheckBox("Green Pepper"); 
        CheckBox cb3 = new CheckBox("Black Olives"); 
        CheckBox cb4 = new CheckBox("Mushrooms"); 
        CheckBox cb5 = new CheckBox("Extra Cheese"); 
        CheckBox cb6 = new CheckBox("Pepperoni"); 
        CheckBox cb7 = new CheckBox("Sausage"); 
        cb1.setLayoutX(70);
        cb1.setLayoutY(165);
        cb2.setLayoutX(70);
        cb2.setLayoutY(185);
        cb3.setLayoutX(70);
        cb3.setLayoutY(205);
        cb4.setLayoutX(70);
        cb4.setLayoutY(225);
        cb5.setLayoutX(70);
        cb5.setLayoutY(245);
        cb6.setLayoutX(70);
        cb6.setLayoutY(265);
        cb7.setLayoutX(70);
        cb7.setLayoutY(286);
        root.getChildren().addAll(cb1,cb2,cb3,cb4,cb5,cb6,cb7);

        
        Label PSize= new Label("Pizza Size");
        PSize.setStyle("-fx-font-weight: bold");
        PSize.setLayoutX(250);
        PSize.setLayoutY(140);
        root.getChildren().add(PSize);
        
        ToggleGroup group2 = new ToggleGroup();  
        RadioButton rb1 = new RadioButton("Small: .00");  
        RadioButton rb2 = new RadioButton("Medium: .00"); 
        RadioButton rb3 = new RadioButton("Large: .00"); 
       RadioButton rb4 = new RadioButton("Family: 0.00"); 
      rb1.setToggleGroup(group2);  
       rb2.setToggleGroup(group2);
       rb3.setToggleGroup(group2);  
       rb4.setToggleGroup(group2);  
       
       rb1.setLayoutX(240);
       rb1.setLayoutY(165);
       rb2.setLayoutX(240);
       rb2.setLayoutY(185);
       rb3.setLayoutX(240);
       rb3.setLayoutY(205);
       rb4.setLayoutX(240);
       rb4.setLayoutY(225);
       root.getChildren().addAll(rb1,rb2,rb3,rb4);
       
       Label type= new Label("Pizza Type");
        type.setStyle("-fx-font-weight: bold");
        type.setLayoutX(400);
        type.setLayoutY(140);
        root.getChildren().add(type);
        
        ToggleGroup group3 = new ToggleGroup();  
        RadioButton rb5 = new RadioButton("Thin Crust");  
        RadioButton rb6 = new RadioButton("Medium Crust"); 
        RadioButton rb7 = new RadioButton("Crust Lover"); 
      
      rb5.setToggleGroup(group3);  
       rb6.setToggleGroup(group3);
       rb7.setToggleGroup(group3);  
      
       
       rb5.setLayoutX(405);
       rb5.setLayoutY(165);
       rb6.setLayoutX(405);
       rb6.setLayoutY(185);
       rb7.setLayoutX(405);
       rb7.setLayoutY(205);
       
       root.getChildren().addAll(rb5,rb6,rb7);
       
        CheckBox mc = new CheckBox("Members Card");  
        mc.setLayoutX(240);
        mc.setLayoutY(255);
        root.getChildren().add(mc);
        
        Button bt1= new Button("Place Order");
        bt1.setLayoutX(245);
        bt1.setLayoutY(300);
        root.getChildren().add(bt1);
        
        Button bt2= new Button("Print all Orders");
        bt2.setLayoutX(445);
        bt2.setLayoutY(600);
        root.getChildren().add(bt2);
        
        
        Label dets= new Label("Your Order Details");
        dets.setStyle("-fx-font-weight: bold");
        dets.setLayoutX(45);
        dets.setLayoutY(350);
        root.getChildren().add(dets);
        
        TextArea ta= new TextArea();
        double height= 140;
        ta.setPrefHeight(height);
        ta.setLayoutX(45);
        ta.setLayoutY(380);
        root.getChildren().add(ta);
        
        
        Scene s = new Scene(root, 570, 650);
        Stage.setTitle("Sample Application");
        Stage.setScene(s);
        Stage.show();
    }

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

这是工厂Class

public class PizzaFactory {

    public Pizza makePizza(String newPizza) {
        

        
        if(newPizza== null) {
            return null;
        }
        
        if(cb1.isSelected()) {
            
        }
        return null;
    
    }
}

编辑:cb1 是 if(cb1.isSelected())

中的一个错误

您的披萨生成器方法不应访问布局元素,例如复选框。您应该遵循某种 MVC 结构,将布局与数据分开,并将数据(模型)从您的控制器传递给您的披萨制造商。

像这样:

public class Pizza extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        PizzaModel model = new PizzaModel();
        primaryStage.setScene(new Scene(buildPizzaView(model, () -> System.out.println(buildPizza(model)))));
        primaryStage.show();
    }

    private static String buildPizza(PizzaModel model) {
        return "Here's your pizza! " + (model.isHasMushrooms() ? "Mushrooms " : "") + (model.isHasPepperoni() ? "Pepperoni" : "");
    }

    private static Region buildPizzaView(PizzaModel model, Runnable actionHandler) {
        Button button = new Button("Make Pizza");
        button.setOnAction(evt -> actionHandler.run());
        VBox results = new VBox(10,
                                createBoundCheckBox("Pepperoni", model.hasPepperoniProperty()),
                                createBoundCheckBox("Mushrooms", model.hasMushroomsProperty()),
                                button);
        return results;

    }

    private static Node createBoundCheckBox(String label, BooleanProperty boundProperty) {
        CheckBox results = new CheckBox(label);
        results.selectedProperty().bindBidirectional(boundProperty);
        return results;
    }

    class PizzaModel {
        BooleanProperty hasPepperoni = new SimpleBooleanProperty(false);
        BooleanProperty hasMushrooms = new SimpleBooleanProperty(false);

        public boolean isHasPepperoni() {
            return hasPepperoni.get();
        }

        public BooleanProperty hasPepperoniProperty() {
            return hasPepperoni;
        }

        public boolean isHasMushrooms() {
            return hasMushrooms.get();
        }

        public BooleanProperty hasMushroomsProperty() {
            return hasMushrooms;
        }
    }
}

此外,您使用 Group 然后设置布局 [X,Y] 会给您自己带来很多工作。使用一个或多个布局区域,如 GridPane、BorderPane、VBox、HBox 或 FlowPane,您将省去很多精力。