JavaFX VBox未在网格窗格内对齐
我试图在JavaFX中构建一个计算器,但是VBox没有与GridPane中的其他节点对齐 我使用GridPane作为根节点,并在每个单元格位置放置单独的按钮 最右边的列是一个VBox,其中包含一列按钮 问题是这个VBox与其他按钮的距离有几个像素-它不会对齐。这就是我所看到的: 我已尝试设置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
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