我希望在javaFX中对齐复选框

我希望在javaFX中对齐复选框,java,javafx,Java,Javafx,我需要创建一个带有对齐复选框的GUI,如下图所示: 我尝试的代码会导致以下图像: 我用了3个HBox,每个HBox包含两个浇头。然后我将HBox添加到ToppingOptions窗格 我需要做什么来对齐复选框 我尝试使用两个VBox,每个VBox包含三个浇头,第一个VBox位于左中,第二个VBox位于右中。第二个VBox最终显示在第一个VBox下,而不是它旁边。所以那没用 import javafx.event.ActionEvent; import javafx.geometry.Pos;

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

我尝试的代码会导致以下图像:

我用了3个HBox,每个HBox包含两个浇头。然后我将HBox添加到ToppingOptions窗格

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

我尝试使用两个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));
    }
}

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

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

可能:)但请注意:如果初始条件不成立,像这样的嵌套布局可能会中断(这里是f.i.,如果其中一个检查的字体比其他检查的字体大得多)。最好试着找到一个能提供您所需要的确切服务的布局(我猜这里是一个网格窗格)我不明白如何从一种编码(Java)转换到另一种编码(FXML)会突然让您理解JavaFX布局的概念。可能:)但请注意:如果初始条件不成立,像这样的嵌套布局可能会中断(这里是f.i.,如果其中一个检查的字体比其他检查的字体大得多)。最好尝试找到一个布局,它提供您所需的确切服务(我猜这里是一个网格窗格)。我不明白从一种编码(Java)切换到另一种编码(FXML)会如何突然让您理解JavaFX布局的概念,第一步是获得所有可用布局的概述-通过api文档(和/或适当的教程)了解哪些布局可以处理哪些布局。顺便说一句:扩展版面(几乎-但在这里肯定)总是错误的方法,它们是用来解决版面问题的。解决版面问题时,第一步是获得所有可用版面的概述-通过api文档(和/或适当的教程)了解哪些可以处理哪些问题。顺便说一句:扩展布局(几乎是,但在这里肯定是)总是错误的方法,它们是用于使用的。