JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

news2024/11/25 0:18:55

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

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();
}
注册页面案例制作
分析布局
分析控件
用户名 输入框 TextField
用户密码 密码框 PasswordField
用户性别 单选框 RadioButton
用户地址 下拉框 ChoiceBox
用户爱好 复选框 CheckBox
注册 , 取消 按钮 Button
控件讲解
单选框的使用
构建单选框
RadioButton men = new RadioButton("图标");
RadioButton miss = new RadioButton("图标");
这样的单选框是无法实现单选功能的 , 只有当单选按钮在一组的时候才能完成单选功能
ToggleGroup group = new ToggleGroup();//构建单选按钮组
设置两个按钮为一组
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();
下拉框的选项是一个 ObservableList , 所以我们是无法直接向其中添加文本作为下拉框选项 , 需要进行代码改造
1. 将文本内容放到 List 集合中
2. List 集合转换成一个 ObservableList
3. 通过构造方法或者是 setItems 方法给下拉框设置选项
//定义下拉框内容集合
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<String> choiceBox = new ChoiceBox<String>();
注意, getItems() 方法得到的是一个 ObservableList ,我们讲解过的 List 方法它也都能使用
choiceBox.getItems().addAll("湖南省","四川省","湖北省")
运行之后可以观察到下拉框中默认是没有选中值的 , 可以通过方法设置其下拉框默认选中
choiceBox.setValue("湖南省");

也可容易通过方法来获得下拉框中被选中的选项与选项下标

//被选中选项的下标
int selectedIndex = choiceBox.getSelectionModel().getSelectedIndex();
//被选中的选项
String selectedItem = choiceBox.getSelectionModel().getSelectedItem()

 还可以通过 getValue() 来获得下拉框选中的值

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("打篮球");
对于复选框和单选框,都可以通过 setSelected(boolean) 来设置选中状态,通过 isSelected() 来获取选中状态
CheckBox c1 = new CheckBox("打篮球");
CheckBox c2 = new CheckBox("打游戏");
CheckBox c3 = new CheckBox("打豆豆");

完整代码

@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 布局: 在这个布局中 , 控件都显示为 一行
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("打豆豆");
可以选择和单选框一样的做法
HBoxh2=newHBox();
h2.getChildren().addAll(c1,c2,c3);
按钮设置
Buttonregister=newButton("注册");
Buttoncancel=newButton("取消");
控件与网格绑定
//用户名
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
publicvoidstart(StageprimaryStage)throwsIOException{
  //新建布局
  GridPanegridPane=newGridPane();  //设置居中方式
  gridPane.setAlignment(Pos.CENTER);  //调整间隙
  gridPane.setHgap(10);
  gridPane.setVgap(10);


  //文本标签
  Labell1=newLabel("用户名");
  Labell2=newLabel("用户密码");  
  Labell3=newLabel("用户性别");  
  Labell4=newLabel("用户地址");  
  Labell5=newLabel("用户爱好");

  //输入框
  TextFieldf1=newTextField();
  PasswordFieldf2=newPasswordField();

  //性别
  ToggleGroupgroup=newToggleGroup();
  RadioButtonmen=newRadioButton("图标");
  RadioButtonmiss=newRadioButton("图标");  men.setToggleGroup(group);
  miss.setToggleGroup(group);
  men.setSelected(true);
  HBoxh1=newHBox();
  h1.getChildren().addAll(men,miss);

  //构建选项集合
  List<String>list=Arrays.asList("湖南省","四川省","湖北省");  //生成并设置下拉框选项
  ChoiceBox<String>choiceBox=newChoiceBox<String>(items);
  //这里替换成数据库的集合便可以完成数据库值的显示
  choiceBox.addAll(list);
  //设置下拉框默认值
  choiceBox.setValue(list.get(0));

  //复选框
  CheckBoxc1=newCheckBox("打篮球");
  CheckBoxc2=newCheckBox("打游戏");  
  CheckBoxc3=newCheckBox("打豆豆");  
  HBoxh2=newHBox();
  h2.getChildren().addAll(c1,c2,c3);

  //登录按钮的创建
  Buttonregister=newButton("注册"); 
  Buttoncancel=newButton("取消");

  //用户名
  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);

  //生成场景并完成布局绑定,同时设定场景大小
  Scenescene=newScene(gridPane,300,200);  //主容器标题设置
  primaryStage.setTitle("网格登录");
  //给主容器绑定场景(让场景显示出来)
  primaryStage.setScene(scene);
  //不要忘了这一行,让主容器显示
  primaryStage.show();
}
按钮事件制作
取消按钮
cancel.setOnAction(e->{
  Platform.exit();//退出程序});
注册按钮
需要在这里获取到对应的值 , 然后带入数据库执行插入操作 , 对于绝大部门控件 , 都可以通过
框则需要使用 getValue() 方法 , 而对于单选框与多选框 , 则需要对选中状态进行判断
//获得用户名
Stringusername=f1.getText();//获得密码
Stringpassword=f2.getText();
//获得性别 men男单选框 miss女单选框
Stringgender="男";//默认是选中了男,可以查看上面的代码
if(miss.isSelected()){
  gender="女";}

//通过拼接的方式获得所有的爱好每个爱好以,隔开
StringJoinerjoiner=newStringJoiner(",");//对于复选框而言,如果该复选框被选中,则记录该值
if(c1.isSelected()){
  joiner.add(c1.getText())
;}
if(c2.isSelected()){
  joiner.add(c1.getText())
;}
if(c3.isSelected()){
  joiner.add(c1.getText());
}
Stringhobby=joiner.toString();
可以使用正常的拼接 , 但是后面会多一个逗号,所以推荐使用StringJoiner该类会帮我们加上自定义的分隔符
//下拉框选中的值
Stringaddress=choiceBox.getValue().toString();
这里拿到的如果是 Object, 我们需要的地址是 String, 所以请记得调用 toString() 方法
下面就可以去数据库访问了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列预测模型实战案例(十)(CNN-GRU-LSTM)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

本文介绍 本篇博客为大家讲解的是通过组堆叠CNN、GRU、LSTM个数&#xff0c;建立多元预测和单元预测的时间序列预测模型&#xff0c;其效果要比单用GRU、LSTM效果好的多&#xff0c;其结合了CNN的特征提取功能、GRU和LSTM用于处理数据中的时间依赖关系的功能。通过将它们组合在…

快速构建高质量中文APP登录注册页面Figma源文件

在这个数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面&#xff0c;并寻找高质量的UI设计素材&#xff0c;那么您来对地方了&#xff01;我们为您提供了一个完整的Figma源文件…

Java语言级别8不支持本地枚举和语言级别 ‘8‘ 不支持 内部类中的 static 声明

Java语言级别8不支持本地枚举和语言级别 8 不支持 内部类中的 static 声明 具体报错情况总结 具体报错情况 今天笔者准备在Test下的测试方法创建枚举类的时候&#xff0c;发现出现了报错Java”语言级别8不支持本地枚举“。 然后又试试创建一个类中包含一个枚举类时&#xff0c;…

JavaFX进阶:学生管理系统结构讲解,复合布局集成,表格数据显示

系统介绍 我们会通过一个学生管理系统来学习 其中 , 分为两个角色 老师 Teacher public class Teacher { private Integer id; private String name; private String password; private String gender; } 学生 Student public class Student { private Integer id; priva…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割10(测试推理篇)

对于直接将裁剪的patch&#xff0c;一个个的放到训练好的模型中进行预测&#xff0c;这部分代码可以直接参考前面的训练部分就行了。其实说白了&#xff0c;就是验证部分。不使用dataloader的方法&#xff0c;也只需要修改少部分代码即可。 但是&#xff0c;这种方法是不end t…

Busco-真核生物为主基因组质量评估

文章目录 简介Install必须参数谱系数据集输出结果自动谱系选择结果解读完整片段化缺失 自动选择&#xff1a;多domain和污染匹配注意BUSCO报告常用脚本真核Ref 简介 Busco评估基因组质量的核心原理在于通过计算基因组的通用单拷贝标记基因的比例来估计基因组的完整性。其中两个…

Javascript知识点详解:对象的继承、原型对象、原型链

目录 对象的继承 原型对象概述 构造函数的缺点 prototype 属性的作用 原型链 constructor 属性 instanceof 运算符 构造函数的继承 多重继承 对象的继承 面向对象编程很重要的一个方面&#xff0c;就是对象的继承。A 对象通过继承 B 对象&#xff0c;就能直接拥有 B …

C++之函数中实现类、调用总结(二百五十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

MySQL之表的增删改查

目录 表的增删改查1.Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2.Retrieve1.1 SELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 1.2 WHERE 条件普遍使用NULL 的查询结果排序筛选分页结果 3.Update对查询到的结果…

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…

MySQL库的库操作指南

1.创建数据库 一般格式&#xff1a;create database (if not exists) database1_name,database2_name...... 特殊形式&#xff1a; create database charset harset_name collate collate_name 解释&#xff1a; 红色字是用户自己设置的名称charset&#xff1a;指定数据…

照片处理软件 DxO FilmPack 7 mac中文版软件介绍

DxO FilmPack 7 mac是一款照片处理软件&#xff0c;专为摄影后期制作而设计。该软件来自法国的DXO公司&#xff0c;它可以在数码影像上模拟胶卷的颜色、对比度、颗粒感等。DxO FilmPack 7提供了多种胶卷颜色效果&#xff0c;包括7种正片胶卷颜色、9种单色照片胶卷颜色、5种负片…

71 内网安全-域横向网络传输应用层隧道技术

目录 必备知识点&#xff1a;1.代理和隧道技术区别?2.隧道技术为了解决什么?3.隧道技术前期的必备条件? 演示案例:网络传输应用层检测连通性-检测网络层ICMP隧道Ptunnel使用-检测利用传输层转发隧道Portmap使用-检测,利用传输层转发隧道Netcat使用-检测,利用,功能应用层DNS隧…

浮点数保留指定位数的小数,小数位自动去掉多余的0

通过DecimalFormat.format可以按照指定的格式格式化数据。 public class test { public static void main(String[] args) { DecimalFormat dnew DecimalFormat(“#.#”);//在有小数的情况下留一位小数&#xff0c;默认是四舍五入 BigDecimal decimalnew BigDecimal(“3.14159…

SQL入门语句

MySQL和SQL的区别是什么&#xff1f;之间是什么关系&#xff1f; SQL&#xff08;Structured Query Language&#xff09;是用于管理和操作关系型数据库&#xff08;RDBMS&#xff09;的标准语言。SQL还可以用于这些RDBMS&#xff1a;MySQL、Oracle、Microsoft SQL Server、Pos…

React进阶之路(二)-- 组件通信、组件进阶

文章目录 组件通信组件通信的意义父传子实现props说明子传父实现兄弟组件通信跨组件通信Context通信案例 React组件进阶children属性props校验组件生命周期 组件通信 组件通信的意义 组件是独立且封闭的单元&#xff0c;默认情况下组件只能使用自己的数据&#xff08;state&a…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

P1131 [ZJOI2007] 时态同步

Portal. 先找出树上以 S S S 为起点最长的一条链&#xff0c;然后让其他链的长度都和该链对齐即可。 维护每个结点 x x x 的子树最长链 d max ⁡ ( x ) d_{\max}(x) dmax​(x)&#xff0c;则每次 DFS 求出最长链之后调整对齐的代价为 d max ⁡ ( x ) − ( d max ⁡ ( s o …

Java算法(二):数组元素求和(元素个位和十位不能是 7 ,且只能是偶数)

java算法&#xff08;二&#xff09; 需求&#xff1a; ​ 有这样一个数组&#xff1a; 元素是&#xff1a;{68, 27, 95, 88, 171, 996, 51, 210} ​ 求出该数组中满足要求的元素和 ​ 要求是&#xff1a; 求和的元素各位和十位都不能是 7 &#xff0c;并且只能是偶数 packa…

机器学习中的假设检验

正态性检验相关分析回归分析 所谓假设检验&#xff0c;其实就是根据原假设来构造一种已知分布的统计量来计算概率&#xff0c;根据概率值大小来判断能否拒绝原假设&#xff0c;从而得到一种结论。假设检验的过程就是&#xff0c;构造一个原假设成立条件下的事件A&#xff0c;计…