JavaFX VBox未在网格窗格内对齐

JavaFX VBox未在网格窗格内对齐,javafx,gridpane,vbox,Javafx,Gridpane,Vbox,我试图在JavaFX中构建一个计算器,但是VBox没有与GridPane中的其他节点对齐 我使用GridPane作为根节点,并在每个单元格位置放置单独的按钮 最右边的列是一个VBox,其中包含一列按钮 问题是这个VBox与其他按钮的距离有几个像素-它不会对齐。这就是我所看到的: 我已尝试设置VBox的对齐方式,但这没有任何区别。我错过了什么 package calculator; import java.util.ArrayList; import java.util.List; import

我试图在JavaFX中构建一个计算器,但是VBox没有与GridPane中的其他节点对齐

我使用GridPane作为根节点,并在每个单元格位置放置单独的按钮

最右边的列是一个VBox,其中包含一列按钮

问题是这个VBox与其他按钮的距离有几个像素-它不会对齐。这就是我所看到的:

我已尝试设置VBox的对齐方式,但这没有任何区别。我错过了什么

package calculator;

import java.util.ArrayList;
import java.util.List;
import javafx.application.*;
import static javafx.application.Application.launch;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;

public class UserInterface extends Application {

    private static int appWidth = 200 * 3;
    private static int appHeight = 310 * 3;
    private static int numRows = 7;
    private static int numCols = 8;
    List<Button> buttonList = new ArrayList();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        Application.setUserAgentStylesheet(STYLESHEET_MODENA);

//Create 0-9 buttons
        for (int i = 0; i < 10; i++) {
            Button tempButton = new Button(Integer.toString(i));
            tempButton.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
            HBox.setHgrow(tempButton, Priority.ALWAYS);
            buttonList.add(tempButton);
        }

//Point button
        Button point = new Button(".");
        point.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

//Multiply and division buttons
        Button multiply = new Button("X");
        multiply.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(multiply, Priority.ALWAYS);

        Button divide = new Button("/");
        divide.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(divide, Priority.ALWAYS);

//Plus and minus buttons
        Button plus = new Button("+");
        plus.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(plus, Priority.ALWAYS);

        Button minus = new Button("-");
        minus.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(minus, Priority.ALWAYS);

//Equals button
        Button equals = new Button("=");
        equals.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(equals, Priority.ALWAYS);

//Clear and delete buttons
        Button clear = new Button("AC");
        clear.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

        Button del = new Button("Del");
        del.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

//Screen label
        Label screen = new Label("0");
        screen.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        screen.setAlignment(Pos.CENTER_RIGHT);

//Create GridPane
        GridPane grid = new GridPane();
        grid.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

//Create VBox to contain right column buttons
        VBox rightCol = new VBox(divide, multiply, minus, plus, equals);
        VBox.setVgrow(rightCol, Priority.ALWAYS);
        rightCol.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

//Add nodes to grid pane
        grid.add(buttonList.get(0), 0, 6, 4, 1);
        grid.add(point, 4, 6, 2, 1);
        //grid.add(equals, 6, 6, 2, 1);

        grid.add(buttonList.get(1), 0, 5, 2, 1);
        grid.add(buttonList.get(2), 2, 5, 2, 1);
        grid.add(buttonList.get(3), 4, 5, 2, 1);
        //grid.add(plus, 6, 5, 2, 1);

        grid.add(buttonList.get(4), 0, 4, 2, 1);
        grid.add(buttonList.get(5), 2, 4, 2, 1);
        grid.add(buttonList.get(6), 4, 4, 2, 1);
        //grid.add(minus, 6, 4, 2, 1);

        grid.add(buttonList.get(7), 0, 3, 2, 1);
        grid.add(buttonList.get(8), 2, 3, 2, 1);
        grid.add(buttonList.get(9), 4, 3, 2, 1);
        //grid.add(multiply, 6, 3, 2, 1);

        grid.add(clear, 0, 2, 3, 1);
        grid.add(del, 3, 2, 3, 1);
        //grid.add(divide, 6, 2, 2, 1);

//Add the right column        
        grid.add(rightCol, 6, 2, 2, 5);

        //Add the screen
        grid.add(screen, 0, 0, 8, 2);

        //Set row and column constraints
        for (int rowIndex = 0; rowIndex < UserInterface.numRows; rowIndex++) {
            RowConstraints rc = new RowConstraints();
            rc.setVgrow(Priority.ALWAYS);
            rc.setFillHeight(true);
            rc.setPercentHeight(UserInterface.appHeight / UserInterface.numRows);
            grid.getRowConstraints().add(rc);
        }
        for (int colIndex = 0; colIndex < UserInterface.numCols; colIndex++) {
            ColumnConstraints cc = new ColumnConstraints();
            cc.setHgrow(Priority.ALWAYS);
            cc.setFillWidth(true);
            cc.setPercentWidth(UserInterface.appWidth / UserInterface.numCols);
            grid.getColumnConstraints().add(cc);
        }

        grid.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

// Create the scene and the stage
        //grid.setGridLinesVisible(true);
        Scene scene = new Scene(grid, appWidth, appHeight);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Calculator");
        primaryStage.setResizable(false);
        primaryStage.show();
    }
}
package计算器;
导入java.util.ArrayList;
导入java.util.List;
导入javafx.application.*;
导入静态javafx.application.application.launch;
导入javafx.geometry.*;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.stage.*;
公共类用户接口扩展应用程序{
私有静态int-appWidth=200*3;
专用静态int-appHeight=310*3;
私有静态int numRows=7;
私有静态int numCols=8;
列表按钮列表=新建ArrayList();
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage primaryStage)引发异常{
Application.setUserAgentStylesheet(样式表_MODENA);
//创建0-9个按钮
对于(int i=0;i<10;i++){
Button tempButton=新按钮(整数.toString(i));
tempButton.setMaxSize(Double.MAX_值,Double.MAX_值);
HBox.setHgrow(tempButton,Priority.ALWAYS);
按钮列表。添加(临时按钮);
}
//点按钮
按钮点=新按钮(“.”);
point.setMaxSize(Double.MAX_值,Double.MAX_值);
//乘法和除法按钮
按钮倍增=新按钮(“X”);
multiply.setMaxSize(Double.MAX\u值,Double.MAX\u值);
VBox.setVgrow(乘法、优先级、始终);
按钮分割=新按钮(“/”);
divide.setMaxSize(Double.MAX_值,Double.MAX_值);
VBox.setVgrow(divide,Priority.ALWAYS);
//加号和减号按钮
按钮+=新按钮(“+”);
plus.setMaxSize(Double.MAX_值,Double.MAX_值);
VBox.setVgrow(加上Priority.ALWAYS);
按钮减号=新按钮(“-”);
减.setMaxSize(Double.MAX_值,Double.MAX_值);
VBox.setVgrow(减号,优先级,始终);
//相等按钮
按钮等于=新按钮(“=”);
等于.setMaxSize(Double.MAX\u值,Double.MAX\u值);
VBox.setVgrow(equals,Priority.ALWAYS);
//清除和删除按钮
按钮清除=新按钮(“AC”);
clear.setMaxSize(Double.MAX\u值,Double.MAX\u值);
按钮删除=新按钮(“删除”);
del.setMaxSize(Double.MAX_值,Double.MAX_值);
//屏幕标签
标签屏幕=新标签(“0”);
screen.setMaxSize(Double.MAX_值,Double.MAX_值);
屏幕设置对齐(位置居中\右侧);
//创建网格窗格
GridPane grid=新建GridPane();
grid.setMaxSize(Double.MAX_值,Double.MAX_值);
//创建VBox以包含右列按钮
VBox rightCol=新的VBox(除、乘、减、加、等于);
VBox.setVgrow(rightCol,Priority.ALWAYS);
rightCol.setMaxSize(Double.MAX_值,Double.MAX_值);
//将节点添加到网格窗格
add(buttonList.get(0),0,6,4,1);
添加(第4、6、2、1点);
//加(等于,6,6,2,1);
add(buttonList.get(1),0,5,2,1);
添加(按钮列表获取(2),2,5,2,1);
add(buttonList.get(3),4,5,2,1);
//加上(加上,6,5,2,1);
add(buttonList.get(4),0,4,2,1);
add(buttonList.get(5),2,4,2,1);
add(buttonList.get(6),4,4,2,1);
//加(减,6,4,2,1);
add(buttonList.get(7),0,3,2,1);
add(buttonList.get(8),2,3,2,1);
add(buttonList.get(9),4,3,2,1);
//加(乘,6,3,2,1);
添加(清除、0、2、3、1);
添加(del,3,2,3,1);
//加(除法,6,2,2,1);
//添加右边的列
添加(右列,6,2,2,5);
//添加屏幕
添加(屏幕,0,0,8,2);
//设置行和列约束
对于(int-rowIndex=0;rowIndex
如果您希望这些按钮对齐,为什么不将它们放入
网格窗格
?不同的父母可能以不同的方式决定孩子的位置。您无法确定
VBox
布局子元素的方式是否与
GridPane
布局子元素的方式相同,只包含一列,更不用说在不同的列中包含其他子元素了。谢谢您的帮助。我现在只是在试验。我可以直接把它们放在GridPane中,我计划对这些按钮应用一些特定的css,并认为将它们包含在自己的框中会有所帮助。什么是t