首页 > 解决方案 > 我希望在 javaFX 中对齐复选框

问题描述

我需要创建一个带有对齐复选框的 GUI,如下图所示: 示例图像

我尝试的代码导致下图: 我的代码的结果

我使用了 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);
    }
}

标签: javajavafx

解决方案


首先,如果有机会,我真的建议您使用 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);

在此处输入图像描述


推荐阅读