我想对齐javaFX中的复选框

时间:2020-09-22 04:01:24

标签: java javafx

我需要创建一个具有对齐复选框的GUI,如下图所示: example image

我尝试的代码导致下图: result of my code

我使用了3个HBox,每个HBox包含两个浇头。然后,我将HBoxes添加到ToppingsOptionPane中。

我需要做什么来对齐复选框?

我尝试使用2个VBox,每个VBox包含三个顶部,第一个VBox位于中间居中,第二个VBox位于中间居中。第二个VBox最终显示在第一个VBox下方,而不是旁边。所以那行不通。

import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import java.text.NumberFormat;

//************************************************************************
// ToppingsOptionPane.java
// Shows use of check boxes.
//************************************************************************

public class ToppingsOptionPane extends VBox{
    private Text phrase;
    private double totalPrice;
    private CheckBox pepperoni, olives, bacon, ham, mushroom, meatballs;
    NumberFormat fmt1 = NumberFormat.getCurrencyInstance();

    //--------------------------------------------------------------------
    // Constructor. Sets up pane with Text object and check boxes
    // that determine the price of the pizza.
    //--------------------------------------------------------------------
    public ToppingsOptionPane(){

        totalPrice = 10;
        phrase = new Text("Pizza Cost: " + fmt1.format(totalPrice));
        phrase.setFont(new Font("Helvetica", 20));

        pepperoni = new CheckBox("Pepperoni");
        pepperoni.setOnAction(this::processCheckBoxAction);

        olives = new CheckBox("Olives");
        olives.setOnAction(this::processCheckBoxAction);

        HBox toppings1 = new HBox(pepperoni,olives);
        toppings1.setAlignment(Pos.CENTER);
        toppings1.setSpacing(20);

        bacon = new CheckBox("Bacon");
        bacon.setOnAction(this::processCheckBoxAction);

        ham = new CheckBox("Ham");
        ham.setOnAction(this::processCheckBoxAction);

        HBox toppings2 = new HBox(bacon,ham);
        toppings2.setAlignment(Pos.CENTER);
        toppings2.setSpacing(20);

        mushroom = new CheckBox("Mushroom");
        mushroom.setOnAction(this::processCheckBoxAction);

        meatballs = new CheckBox("Meatballs");
        meatballs.setOnAction(this::processCheckBoxAction);

        HBox toppings3 = new HBox(mushroom,meatballs);
        toppings3.setAlignment(Pos.CENTER);
        toppings3.setSpacing(20);

        setSpacing(20); // between text and checkboxes
        getChildren().addAll(toppings1,toppings2,toppings3,phrase);
    }

    //--------------------------------------------------------------------
    // Event handler. Updates price of the pizza.
    //--------------------------------------------------------------------
    public void processCheckBoxAction(ActionEvent event){

        int sum = 0;
        double toppings = 0;

        if (pepperoni.isSelected())
            sum+=1;
        if (olives.isSelected())
            sum+=1;
        if (bacon.isSelected())
            sum+=1;
        if (ham.isSelected())
            sum+=1;
        if (mushroom.isSelected())
            sum+=1;
        if (meatballs.isSelected())
            sum+=1;

        toppings = sum * 0.50;
        phrase.setText("Pizza Cost: " + fmt1.format(totalPrice + toppings));
    }
}
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.stage.Stage;

//************************************************************************
// PizzaToppings.java
// Shows use of check boxes.
//************************************************************************
public class PizzaToppings extends Application {

    //--------------------------------------------------------------------
    // Creates and shows program window
    //--------------------------------------------------------------------
    public void start(Stage primaryStage){

        ToppingsOptionPane pane = new ToppingsOptionPane();
        pane.setAlignment(Pos.CENTER);
        pane.setStyle("-fx-background-color: wheat");

        Scene scene = new Scene(pane,400,250);

        primaryStage.setTitle("Pizza Cost");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    //--------------------------------------------------------------------
    // Main method. Calls launch method.
    //--------------------------------------------------------------------
    public static void main(String[] args){
        launch(args);
    }
}

1 个答案:

答案 0 :(得分:2)

首先,如果有机会,我真的建议您使用FXML,它确实有助于解决此类问题。解决问题的方法实际上非常简单,尝试将JavaFX视为一款大型俄罗斯方块游戏,我所做的就是使用两个Vbox,每个Vbox包含3个元素,然后将Vbox放入HBox中。

VBox toppings1V = new VBox(pepperoni, bacon, mushroom);
toppings1V.setSpacing(20);
VBox toppings2V = new VBox(olives, ham, meatballs);
toppings2V.setSpacing(20);
HBox hBox = new HBox(toppings1V, toppings2V);
hBox.setSpacing(30);
hBox.setAlignment(Pos.CENTER);

enter image description here

相关问题