java-fx 网格布局

本文详细介绍了如何使用JavaFX的网格布局创建登录和注册页面,包括控件的定位、间距调整、单选框、下拉框和复选框的使用,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

网格布局

 位置原理讲解

注册页面案例制作

控件讲解

下拉框的使用

复选框的使用

页面制作

 按钮事件制作


 网格布局

将整个面板划分为若干个格子,每个格子的大小是一样的,每个格子中可以放置一个控件(布局),类似于表格的方式。在网格布局 中放入控件的时候,还需要指定位置。

GridPane gridPane = new GridPane();

我们将要排出这个布局,也就是登陆页面的优化版本

 位置原理讲解

以网格布局的思维来拆分该布局,可以分出一个 2*3 的网格

 我们可以给格子从上到下,从左到右依次编号,分别是:

 得出结论: 位置 a,b 其中 a 向右移动需要变大,向下移动则 b 需要变大 且 a,b 都从 0 开始增长

代码 

/新建文本标签:用户名 Label l1 = new Label("用户名");

//新建输入框 TextField name = new TextField("请输入用户名");

//新建文本标签:用户密码 Label l2 = new Label("用户密码");

//新建密码框 PasswordField pwd = new PasswordField();

//登录按钮的创建 Button login = new Button("登录");

//指定位置:按照之前的位置图进行对比并完成位置推理

gridPane.add(l1, 0, 0);

gridPane.add(name, 1, 0);

gridPane.add(l2, 0, 1);

gridPane.add(pwd, 1, 1);

gridPane.add(login, 0, 2);

 网格布局中的网格是默认居左上的

 可以通过代码调整其网格位置

//设置居中方式

gridPane.setAlignment(Pos.CENTER);

Pos 类中定义了一些居中方式

居中运行后

 

 可以观察到每个控件之间挨得太近了,可以使用代码将距离调整开

 gridPane.setHgap(10);//两个格子之间的水平距离

gridPane.setVgap(10);//两个各自之间的垂直距离

 @Override

public void start(Stage primaryStage) throws IOException {

//新建布局

GridPane gridPane = new GridPane();

//设置居中方式

gridPane.setAlignment(Pos.CENTER);

//调整间隙

gridPane.setHgap(

### C++虚基类的使用方法及注意事项 #### 一、虚基类的作用 虚基类的主要目的是为了防止多重继承时产生的二义性和重复数据成员问题。当一个派生类通过多个路径继承同一个基类时,如果不使用虚继承,则会创建该基类的多个实例副本[^2]。 #### 二、虚基类的定义方式 要实现虚继承,在声明派生类时需在 `class` 关键字后面加上关键字 `virtual` 和 `public` 或其他访问修饰符。例如: ```cpp class Base {}; class Derived1 : virtual public Base {}; // 虚继承 class Derived2 : virtual public Base {}; // 虚继承 class FinalDerived : public Derived1, public Derived2 {}; ``` 在此例子中,由于 `Derived1` 和 `Derived2` 都是从 `Base` 类虚继承而来的,所以最终的 `FinalDerived` 只有一个 `Base` 的子对象[^2]。 #### 三、初始化顺序 对于虚基类,其构造函数会在任何非虚基类之前被调用。即使某个中间派生类未显式调用虚基类的构造函数,编译器也会自动为其提供默认参数来完成初始化过程。以下是具体示例代码及其解释: ```cpp #include <iostream> using namespace std; class A { protected: int value; public: A(int v = 0) : value(v) { cout << "A Constructor Called with Value: " << value << endl; } }; class B : virtual public A { public: B() : A(1) { cout << "B Constructor Called" << endl; } }; class C : virtual public A { public: C() : A(2) { cout << "C Constructor Called" << endl; } }; class D : public B, public C { public: D() : A(3), B(), C() { cout << "D Constructor Called" << endl; } }; int main(){ D obj; } ``` 在这个程序里,尽管 `B` 和 `C` 各自尝试设置不同的初始值给它们共同的虚拟父级 `A` ,但由于存在更具体的指令——即来自最底层衍生类别 `D` 所指定之数值 (此处为3),故此优先采用后者作为实际传递至 `A` 构造函式的参数[^3]。 #### 四、内存布局特点 因为引入了额外的信息用于管理共享的基础结构体实例位置关系等原因,通常情况下运用到虚基础类型的实体相较于单纯线性单一层次体系架构下的同等情况会有更大的存储需求量以及稍微复杂一点的操作逻辑[^2]。 #### 五、动态类型转换中的表现形式 如果涉及到从含有虚根节点的对象模型内部提取特定种类别的指针或者引用操作的话,那么就可能需要用到诸如 `dynamic_cast<>` 运算符来进行安全可靠的转型处理动作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值