如何将 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,您将省去很多精力。
我正在使用工厂设计模式在 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,您将省去很多精力。