目标 :
网格布局面板的使用
Dao 层交互
舞台与场景切换
其他控件的使用
网格布局
将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件(布局) , 类似于表格的方式。在网格布局
中放入控件的时候 , 还需要指定位置。
我们将要排出这个布局 , 也就是登陆页面的优化版本
位置原理讲解
以网格布局的思维来拆分该布局 , 可以分出一个 2*3 的网格
GridPane gridPane = new GridPane (); 我们可以给格子从上到下 , 从左到右依次编号 , 分别是:
得出结论:
位置 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 类中定义了一些居中方式
public enum Pos {
TOP_LEFT 左上
TOP_CENTER 居上
TOP_RIGHT 右上
CENTER_LEFT 居左
CENTER 居中
CENTER_RIGHT 居右
BOTTOM_LEFT 左下
BOTTOM_CENTER 居下
BOTTOM_RIGHT 右下
} 可以观察到每个控件之间挨得太近了 , 可以使用代码将距离调整开
完整代码
gridPane . setHgap ( 10 ); // 两个格子之间的水平距离
gridPane . setVgap ( 10 ); // 两个各自之间的垂直距离
@Override
public void start ( Stage primaryStage ) throws IOException {
// 新建布局
GridPane gridPane = new GridPane ();
// 设置居中方式
gridPane . setAlignment ( Pos . CENTER );
// 调整间隙
gridPane . setHgap ( 10 );
gridPane . setVgap ( 10 );
// 新建文本标签:用户名
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 ); 注册页面案例制作
分析布局
分析控件
用户名 输入框 TextField
用户密码 密码框 PasswordField
用户性别 单选框 RadioButton
用户地址 下拉框 ChoiceBox
用户爱好 复选框 CheckBox
注册 , 取消 按钮 Button
控件讲解
单选框的使用
构建单选框
这样的单选框是无法实现单选功能的 , 只有当单选按钮在一组的时候才能完成单选功能
gridPane . add ( name , 1 , 0 );
gridPane . add ( l2 , 0 , 1 );
gridPane . add ( pwd , 1 , 1 );
gridPane . add ( login , 0 , 2 );
// 生成场景并完成布局绑定 , 同时设定场景大小
Scene scene = new Scene ( gridPane , 300 , 200 );
// 主容器标题设置
primaryStage . setTitle ( " 网格登录 " );
// 给主容器绑定场景(让场景显示出来)
primaryStage . setScene ( scene );
// 不要忘了这一行 , 让主容器显示
primaryStage . show ();
}
RadioButton men = new RadioButton ( " " );
RadioButton miss = new RadioButton ( " " );
ToggleGroup group = new ToggleGroup();// 构建单选按钮组 设置两个按钮为一组
完整代码
下拉框的使用
下拉框的选项是一个 ObservableList , 所以我们是无法直接向其中添加文本作为下拉框选项 , 需要进行代码改造
1. 将文本内容放到 List 集合中
2. 将 List 集合转换成一个 ObservableList
3. 通过构造方法或者是 setItems 方法给下拉框设置选项
RadioButton men = new RadioButton(" ");
RadioButton miss = new RadioButton(" ");
ToggleGroup group = new ToggleGroup();
// 实现单选功能
men.setToggleGroup(group);
miss.setToggleGroup(group);
@Override
public void start ( Stage primaryStage ) throws Exception {
FlowPane flowPane = new FlowPane ();
ToggleGroup group = new ToggleGroup ();
RadioButton men = new RadioButton ( " " );
RadioButton miss = new RadioButton ( " " );
men . setToggleGroup ( group );
miss . setToggleGroup ( group );
flowPane . getChildren (). addAll ( men , miss );
Scene scene = new Scene ( flowPane , 300 , 100 );
primaryStage . setScene ( scene );
primaryStage . show ();
}
ChoiceBox choiceBox = new ChoiceBox (); // 定义下拉框内容集合
List < String > items = Arrays . asList ( " 湖南省 " , " 四川省 " , " 湖北省 " );
// 转换成下拉框需要的数据集合
ObservableList < String > items = FXCollections . observableList ( list );
// 通过构造方法设置选项
ChoiceBox choiceBox = new ChoiceBox ( items );
因为 ObservableList 也是一个 List 集合 , 我们也可以直接调用 add 方法为其添加选项
ChoiceBox choiceBox = new ChoiceBox ();
choiceBox . getItems (). add ( " 湖南省 " );
choiceBox . getItems (). add ( " 四川省 " );
choiceBox . getItems (). add ( " 湖北省 " );
重点:我们还可以给下拉框对象设置泛型,从而可以实现超简易写法
ChoiceBox
请同学们注意, getItems() 方法得到的是一个 ObservableList ,我们讲解过的 List 方法它也都能使用
choiceBox . getItems (). addAll ( " 湖南省 " , " 四川省 " , " 湖北省 " );
运行之后可以观察到下拉框中默认是没有选中值的 , 可以通过方法设置其下拉框默认选中
choiceBox . setValue ( " 湖南省 " );
也可容易通过方法来获得下拉框中被选中的选项与选项下标 还可以通过 getValue() 来获得下拉框选中的值
完整代码
复选框的使用
对于复选框和单选框 , 都可以通过 setSelected(boolean) 来设置选中状态 , 通过 isSelected() 来获取选中状态
完整代码
// 被选中选项的下标
int selectedIndex = choiceBox . getSelectionModel (). getSelectedIndex ();
// 被选中的选项
String selectedItem = choiceBox . getSelectionModel (). getSelectedItem ();
String value = choiceBox . getValue ();
@Override
public void start ( Stage primaryStage ) throws Exception {
FlowPane flowPane = new FlowPane ();
ChoiceBox < String > choiceBox = new ChoiceBox < String > ();
choiceBox . getItems (). addAll ( " 湖南省 " , " 四川省 " , " 湖北省 " );
choiceBox . setValue ( " 湖南省 " );
flowPane . getChildren (). add ( choiceBox );
Scene scene = new Scene ( flowPane , 300 , 100 );
primaryStage . setScene ( scene );
primaryStage . show ();
}
CheckBox checkBox = new CheckBox ( " 打篮球 " );
CheckBox c1 = new CheckBox ( " 打篮球 " );
CheckBox c2 = new CheckBox ( " 打游戏 " );
CheckBox c3 = new CheckBox ( " 打豆豆 " ); 页面制作
布局设置
文本控件设置
输入框控件设置
单选框设置
因为按钮的个数不一致 , 导致使用网格布局的时候会出现计算位置比较麻烦的情况 , 我们可以这么做:将多个控件放到一个布局中 ,
再把布局对象当成组件放到对应的网格中
这里我们可以采用流式布局 , 也可以采用 HBox 布局: 在这个布局中 , 控件都显示为一行
@Override
public void start ( Stage primaryStage ) throws Exception {
FlowPane flowPane = new FlowPane ();
CheckBox c1 = new CheckBox ( " 打篮球 " );
CheckBox c2 = new CheckBox ( " 打游戏 " );
CheckBox c3 = new CheckBox ( " 打豆豆 " );
flowPane . getChildren (). addAll ( c1 , c2 , c3 );
Scene scene = new Scene ( flowPane , 300 , 100 );
primaryStage . setScene ( scene );
primaryStage . show ();
}
// 新建布局
GridPane gridPane = new GridPane ();
// 设置居中方式
gridPane . setAlignment ( Pos . CENTER );
// 调整间隙
gridPane . setHgap ( 10 );
gridPane . setVgap ( 10 );
// 文本标签
Label l1 = new Label ( " 用户名 " );
Label l2 = new Label ( " 用户密码 " );
Label l3 = new Label ( " 用户性别 " );
Label l4 = new Label ( " 用户地址 " );
Label l5 = new Label ( " 用户爱好 " );
TextField f1 = new TextField (); // 用户名
PasswordField f2 = new PasswordField (); // 用户密码
ToggleGroup group = new ToggleGroup (); // 按钮组
RadioButton men = new RadioButton ( " " ); // 男
RadioButton miss = new RadioButton ( " " ); // 女
men . setToggleGroup ( group ); // 添加到按钮组 , 实现单选
miss . setToggleGroup ( group ); // 添加到按钮组 , 实现单选
men . setSelected ( true ); // 设置默认选中男 , 防止用户不选的情况 下拉框设置
复选框设置
可以选择和单选框一样的做法
按钮设置
控件与网格绑定
HBox h1 = new HBox ();
h1 . getChildren (). addAll ( men , miss );
// 构建选项集合
List < String > list = Arrays . asList ( " 湖南省 " , " 四川省 " , " 湖北省 " );
// 生成并设置下拉框选项
ChoiceBox < String > choiceBox = new ChoiceBox < String > ( items );
// 这里替换成数据库的集合便可以完成数据库值的显示
choiceBox . addAll ( list );
// 设置下拉框默认值
choiceBox . setValue ( list . get ( 0 ));
CheckBox c1 = new CheckBox ( " 打篮球 " );
CheckBox c2 = new CheckBox ( " 打游戏 " );
CheckBox c3 = new CheckBox ( " 打豆豆 " );
HBox h2 = new HBox ();
h2 . getChildren (). addAll ( c1 , c2 , c3 );
Button register = new Button ( " 注册 " );
Button cancel = new Button ( " 取消 " );
// 用户名
gridPane . add ( l1 , 0 , 0 );
gridPane . add ( f1 , 1 , 0 );
// 用户密码
gridPane . add ( l2 , 0 , 1 );
gridPane . add ( f2 , 1 , 1 );
// 用户性别
gridPane . add ( l3 , 0 , 2 );
gridPane . add ( h1 , 1 , 2 );
// 用户地址
gridPane . add ( l4 , 0 , 3 );
gridPane . add ( choiceBox , 1 , 3 );
// 用户爱好
gridPane . add ( l5 , 0 , 4 );
gridPane . add ( h2 , 1 , 4 );
// 按钮
gridPane . add ( register , 0 , 5 );
gridPane . add ( cancel , 1 , 5 ); 一定要注意上面的单选框和复选框是放的 HBox 布局对象 , 这两个布局对象中已经放了相应的控件了
完整代码
@Override
public void start ( Stage primaryStage ) throws IOException {
// 新建布局
GridPane gridPane = new GridPane ();
// 设置居中方式
gridPane . setAlignment ( Pos . CENTER );
// 调整间隙
gridPane . setHgap ( 10 );
gridPane . setVgap ( 10 );
// 文本标签
Label l1 = new Label ( " 用户名 " );
Label l2 = new Label ( " 用户密码 " );
Label l3 = new Label ( " 用户性别 " );
Label l4 = new Label ( " 用户地址 " );
Label l5 = new Label ( " 用户爱好 " );
// 输入框
TextField f1 = new TextField ();
PasswordField f2 = new PasswordField ();
// 性别
ToggleGroup group = new ToggleGroup ();
RadioButton men = new RadioButton ( " " );
RadioButton miss = new RadioButton ( " " );
men . setToggleGroup ( group );
miss . setToggleGroup ( group );
men . setSelected ( true );
HBox h1 = new HBox ();
h1 . getChildren (). addAll ( men , miss );
// 构建选项集合
List < String > list = Arrays . asList ( " 湖南省 " , " 四川省 " , " 湖北省 " );
// 生成并设置下拉框选项
ChoiceBox < String > choiceBox = new ChoiceBox < String > ( items );
// 这里替换成数据库的集合便可以完成数据库值的显示
choiceBox . addAll ( list );
// 设置下拉框默认值
choiceBox . setValue ( list . get ( 0 ));
// 复选框
CheckBox c1 = new CheckBox ( " 打篮球 " ); 按钮事件制作
取消按钮
注册按钮
需要在这里获取到对应的值 , 然后带入数据库执行插入操作 , 对于绝大部门控件 , 都可以通过 getText() 获得其中的文本内容 , 下拉
框则需要使用 getValue() 方法 , 而对于单选框与多选框 , 则需要对选中状态进行判断
CheckBox c2 = new CheckBox ( " 打游戏 " );
CheckBox c3 = new CheckBox ( " 打豆豆 " );
HBox h2 = new HBox ();
h2 . getChildren (). addAll ( c1 , c2 , c3 );
// 登录按钮的创建
Button register = new Button ( " 注册 " );
Button cancel = new Button ( " 取消 " );
// 用户名
gridPane . add ( l1 , 0 , 0 );
gridPane . add ( f1 , 1 , 0 );
// 用户密码
gridPane . add ( l2 , 0 , 1 );
gridPane . add ( f2 , 1 , 1 );
// 用户性别
gridPane . add ( l3 , 0 , 2 );
gridPane . add ( h1 , 1 , 2 );
// 用户地址
gridPane . add ( l4 , 0 , 3 );
gridPane . add ( choiceBox , 1 , 3 );
// 用户爱好
gridPane . add ( l5 , 0 , 4 );
gridPane . add ( h2 , 1 , 4 );
// 按钮
gridPane . add ( register , 0 , 5 );
gridPane . add ( cancel , 1 , 5 );
// 生成场景并完成布局绑定 , 同时设定场景大小
Scene scene = new Scene ( gridPane , 300 , 200 );
// 主容器标题设置
primaryStage . setTitle ( " 网格登录 " );
// 给主容器绑定场景(让场景显示出来)
primaryStage . setScene ( scene );
// 不要忘了这一行 , 让主容器显示
primaryStage . show ();
}
cancel . setOnAction ( e -> {
Platform . exit (); // 退出程序
}); // 获得用户名
String username = f1 . getText ();
// 获得密码
String password = f2 . getText ();
// 获得性别 men 男单选框 miss 女单选框
String gender = " 男 " ; // 默认是选中了男 , 可以查看上面的代码
if ( miss . isSelected ()){
gender = " 女 " ;
}
// 通过拼接的方式获得所有的爱好 每个爱好以 , 隔开
StringJoiner joiner = new StringJoiner ( "," );
// 对于复选框而言 , 如果该复选框被选中 , 则记录该值
if ( c1 . isSelected ()){
joiner . add ( c1 . getText ());
}
if ( c2 . isSelected ()){
joiner . add ( c1 . getText ());
}
if ( c3 . isSelected ()){
joiner . add ( c1 . getText ());
}
String hobby = joiner . toString ();
可以使用正常的拼接 , 但是后面会多一个逗号 , 所以推荐使用 StringJoiner 该类会帮我们加上自定义的分隔符
// 下拉框选中的值
String address = choiceBox . getValue (). toString ();
这里拿到的如果是 Object, 我们需要的地址是 String, 所以请记得调用 toString() 方法