目标 :
JavaFX 基本介绍
基本布局面板使用
登录界面制作
JavaFX 基本介绍
JavaFX 是用于构建富互联网应用程序的 Java 库。 使用此库编写的应用程序可以跨多个平台一致运行。
使用 JavaFX 开发的应用程序可以在各种设备上运行,如台式计算机,手机,电视,平板电脑等。
要使用 Java 编程语言开发 GUI 应用程序,程序员依赖于诸如高级窗口工具包 (AWT) 和 Swings 之类的库。
在 JavaFX 出现之后,这些 Java 程序开发就可以有效地利用丰富的类库来开发 GUI 应用程序。
代码介绍
Application 是 JavaFX 程序的入口 , 任何 JavaFX 应用程序程序都要继承该类并重写 start() 方法
通过 main() 执行 Application 的 launch() 方法
launch 方法会默认执行该类下的 init() 、 start() 、 stop() 方法
方法执行后的显示顺序为:
init()
方法
➡
start()
方法
➡
stop()
方法
public class
Main
extends
Application
{
@Override
public
void
start
(
Stage primaryStage
) {
}
public static
void
main
(
String
[]
args
) {
launch
(
args
);
}
}
@Override
public
void
init
()
throws
Exception
{
super
.
init
();
}
@Override
public
void
start
(
Stage primaryStage
) {
}
@Override
public void stop () throws Exception { 当 start 方法中没写内容的时候 , 运行时是没有效果的 , 所以需要添加以下代码 :
方法中的参数 primaryStage 表示的就是当前该程序的舞台对象。
一定要记得添加 primaryStage.show() , 不然运行完成之后是没效果的 , 然后就会怀疑自己代码写错了 🙆♂️
整体结构
Stage 是一个主容器 , 或者说是 舞台 , 它就是我们通常所认为的窗口(有边 , 高和宽 , 还有关闭按钮)。在舞台里面 , 我们可以放置一
个 Scene 也就是 场景 , 我们可以把 Scene 理解为子容器 , 当然你可以切换别的 Scene , 而在这个 Scene 里面 , 我们就可以放置各种
各样的控件。
场景面板介绍
布局面板需要和场景搭配使用 , 如果我们需要将内容显示出来 , 就需要将内容放到布局对象中 , 同时也还需要将该布局面板与一个场
景绑定在一起 , 再把场景绑定到舞台中 , 就完成显示了。
舞台( Stage )包含 场景( Scene ) , 场景与布局绑定 , 布局中可以放入多个控件
FlowPane 流式布局
FlowPane 它会在一行上排列连续的子组件 , 并且如果当前行填满了以后 , 则自动将子组件向下推到下一行。
super
.
stop
();
}
@Override
public
void
start
(
Stage primaryStage
)
throws
IOException
{
primaryStage
.
setTitle
(
"
我的
fx
窗口标题
"
);
//
设置当前的窗口标题
primaryStage
.
show
();
//
让当前的窗口显示
}
FlowPane flowPane
=
new
FlowPane
();
构建了布局之后
,
我们可以往里面放入对应的组件。
需要注意的是
,
该布局中可以放入任意多个控件
,
所以该布局内部使用了
List
集合来存放多个控件。
flowPane
.
getChildren
()
//
子元素集合
,
这是一个
List
集合
,
其中存放了该布局下所有的控件
如果想要把一个控件给到该布局
,
简单来说就是将控件加入该子元素集合:
//
构建布局
FlowPane flowPane
=
new
FlowPane
();
//
构建控件
Button l1
=
new
Button
(
"
按钮一
"
);
Button l2
=
new
Button
(
"
按钮二
"
);
Button l3
=
new
Button
(
"
按钮三
"
);
Button l4
=
new
Button
(
"
按钮四
"
);
Button l5
=
new
Button
(
"
按钮五
"
);
//
将控件添加到该布局的子元素集合中
flowPane
.
getChildren
().
add
(
l1
);
flowPane
.
getChildren
().
add
(
l2
);
flowPane
.
getChildren
().
add
(
l3
);
flowPane
.
getChildren
().
add
(
l4
);
flowPane
.
getChildren
().
add
(
l5
);
当控件填充完成之后
,
根据之前所述
,
我们需要将该布局与场景
Scene
进行绑定
Scene scene
=
new
Scene
(
flowPane
,
300
,
300
);
//
以
flowPane
布局创建一个场景
,
大小是
300*300
同时
,
需要将场景与主容器进行绑定
,
才能完成显示
primaryStage
.
setScene
(
scene
);
可以通过拉动窗口大小观察的布局的变化
完整代码如下:
@Override
public
void
start
(
Stage primaryStage
)
throws
IOException
{
//
新建布局
FlowPane flowPane
=
new
FlowPane
();
BorderPane
边框布局
该布局有顶部
,
底部
,
左
,
右与中心区域的五个区域
,
每个区域只能有一个节点。
该布局有
5
个区域可以放入控件
,
所以放入控件的时候需要指定应放在该布局的什么位置:
我们放入
5
个按钮到对应的位置
:
//
新建文本标签控件
Button l1
=
new
Button
(
"
按钮一
"
);
Button l2
=
new
Button
(
"
按钮二
"
);
Button l3
=
new
Button
(
"
按钮三
"
);
Button l4
=
new
Button
(
"
按钮四
"
);
Button l5
=
new
Button
(
"
按钮五
"
);
//
将文本标签控件绑定到布局中
flowPane
.
getChildren
().
add
(
l1
);
flowPane
.
getChildren
().
add
(
l2
);
flowPane
.
getChildren
().
add
(
l3
);
flowPane
.
getChildren
().
add
(
l4
);
flowPane
.
getChildren
().
add
(
l5
);
//
生成场景并完成布局绑定
,
同时设定场景大小
Scene scene
=
new
Scene
(
flowPane
,
200
,
300
);
//
主容器标题设置
primaryStage
.
setTitle
(
"fx"
);
//
给主容器绑定场景(让场景显示出来)
primaryStage
.
setScene
(
scene
);
//
不要忘了这一行
,
让主容器显示
primaryStage
.
show
();
}
BorderPane borderPane
=
new
BorderPane
();
borderPane
.
setCenter
();
//
中央区域
borderPane
.
setBottom
();
//
下方
borderPane
.
setTop
();
//
上方
borderPane
.
setLeft
();
//
左方
borderPane
.
setRight
();
//
右边
//
新建布局
BorderPane borderPane
=
new
BorderPane
();
控件介绍
注意:组件都在
javafx.scene.control
包里面
,
切记不要导错包
Label
文本标签
TextField
输入框
//
新建控件
Button b1
=
new
Button
(
"
中间
"
);
Button b2
=
new
Button
(
"
下面
"
);
Button b3
=
new
Button
(
"
上面
"
);
Button b4
=
new
Button
(
"
左边
"
);
Button b5
=
new
Button
(
"
右边
"
);
//
将控件放入布局对应位置
borderPane
.
setCenter
(
b1
);
borderPane
.
setBottom
(
b2
);
borderPane
.
setTop
(
b3
);
borderPane
.
setLeft
(
b4
);
borderPane
.
setRight
(
b5
);
//
为布局生成场景
Scene scene
=
new
Scene
(
borderPane
,
300
,
300
);
//
将场景绑定到主容器
stage
.
setScene
(
scene
);
//
让主容器显示
stage
.
show
();
Label label
=
new
Label
(
"
我是标签文本
"
);
TextField textField
=
new
TextField
(
"
请输入你的用户名
"
);
PasswordField
密码框
Button 按钮
对于以上这些控件 :
1. 可以通过 setText(string) 设置控件的文本内容
2. 可以通过 getText() 获得控件中的文本内容
按钮的点击事件
通过按钮的 setOnAction 方法可以设置按钮的点击操作 , 该方法需要一个 EventHandler
PasswordField passwordField
=
new
PasswordField
();
Button button
=
new
Button
(
"
我是一个按钮
"
);
Button button
=
new
Button
();
button
.
setText
(
"(
•̀
ω
•́
)
✧
"
);
因为此处是属于 函数式接口 @FunctionalInterface , 所以建议使用 lambda 表达式来编写
案例制作
使用流式布局制作一个登录界面 , 并完成数据库查询
新建布局
控件创建与分析
@FunctionalInterface
public interface EventHandler<T extends Event> extends EventListener {
void handle(T var1);
}
Button button
=
new
Button
(
"
点我
(
●
ˇ
∀
ˇ
●
)"
);
//lamdba
表达式
,
同学们需要习惯一下
button
.
setOnAction
(
e
->
{
System
.
out
.
println
(
"
我被点击了
"
);
});
//
非
lambda
表达式
,
写法比较复杂
button
.
setOnAction
(
new
EventHandler
<
ActionEvent
>
() {
@Override
public
void
handle
(
ActionEvent actionEvent
) {
System
.
out
.
println
(
"
我被点击了
"
);
}
});
FlowPane flowPane
=
new
FlowPane
();
//
新建输入框
TextField name
=
new
TextField
(
"
请输入用户名
"
);
//
新建文本标签:用户密码
Label l2
=
new
Label
(
"
用户密码
"
);
//
新建密码框
PasswordField pwd
=
new
PasswordField
();
//
登录按钮的创建
Button login
=
new
Button
(
"
登录
"
);
控件绑定
场景绑定
舞台设置
登录事件
优化:引入弹出框
flowPane
.
getChildren
().
addAll
(
l1
,
name
,
l2
,
pwd
,
login
);
//
相当于调用了多次
add
方法
,
比较简便
,
但是需要注意顺序
Scene scene
=
new
Scene
(
flowPane
,
230
,
100
);
primaryStage
.
setTitle
(
"
登录
"
);
//
给主容器绑定场景(让场景显示出来)
primaryStage
.
setScene
(
scene
);
//
不要忘了这一行
,
让主容器显示
primaryStage
.
show
();
login
.
setOnAction
(
e
->
{
String
username
=
name
.
getText
();
String
password
=
pwd
.
getText
();
//
带入到
dao
层 进行查询
User user
=
userDao
.
login
(
username
,
password
);
//
判断是否找到该用户
if
(
user
!=
null
){
System
.
out
.
println
(
"
登录成功
"
);
}
else
{
System
.
out
.
println
(
"
登陆失败
,
请检查
"
);
}
});
//
定义弹出框对象
Alert alert
=
new
Alert
(
Alert
.
AlertType
.
ERROR
,
"
登陆失败
"
);
//
调用弹出框的显示方法
alert
.
showAndWait
();
AlertType
NONE
ERROR
WARNING
CONFIRMATION
INFORMATION
if
(
user
!=
null
){
new
Alert
(
Alert
.
AlertType
.
INFORMATION
,
"
登录成功
"
).
showAndWait
();
}
else
{
new
Alert
(
Alert
.
AlertType
.
ERROR
,
"
登录失败
"
).
showAndWait
();
}