【问题标题】:I wish to align checkboxes in javaFX我希望在 javaFX 中对齐复选框
【发布时间】:2021-01-08 04:13:18
【问题描述】:

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

我尝试的代码结果如下图:

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

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

我尝试使用 2 个包含三个顶部的 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);
    }
}

【问题讨论】:

  • 解决布局问题时,第一步是了解所有可用布局的概览 - 通过 api 文档(和/或适当的教程)了解哪些可以处理什么。顺便说一句:扩展布局(几乎 - 但肯定在这里)总是错误的方法,它们旨在使用

标签: java javafx


【解决方案1】:

首先,如果有机会,我真的建议您使用 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 布局概念。
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2017-09-12
相关资源
最近更新 更多