目标
事件介绍
事件应用
概述
本次课程
,
我们将讲解
JavaFX
里面的事件
,
同时完善一些对应的功能
事件介绍
何为
事件
,
在
JavaFX
应用程序中
,
事件用来通知一些事情发生了。当用户点击一个按钮、按下一个键、移动鼠标、或者执行其他的
操作
,
都会有事件会被派生出来。在应用程序中注册事件过滤器和事件处理器可以接收到事件并提供响应。
JavaFX
提供了处理各种事件的支持。
javafx.event.Event
类是事件的基类。
常用事件类型如下:
下面列举一下对于我们来说比较常用的事件
键盘事件
onKeyPressed
当节点具有焦点并按下键时将调用该函数。
onKeyReleased
当节点具有焦点并释放键时将调用该函数。
onKeyTyped
当节点具有焦点并键入键时将调用该函数。
鼠标事件
onMouseClicked
当在节点上单击鼠标按钮时将调用该函数。
onMouseEntered
当鼠标进入节点时将调用该函数。
onMouseExited
当鼠标退出节点时将调用该函数。
onMouseMoved
当鼠标在节点内移动并且没有按下按钮时将调用该函数。
onMousePressed
当在节点上按下鼠标按钮时将调用该函数。
onMouseReleased
当在节点上释放鼠标按钮时将调用该函数。
功能实现
首页下拉框功能
通过改变下拉框的值
,
从而改变首页的显示内容
分析:
给下拉框添加事件
,
在下拉框收到改变后触发
点击事件
setOnAction
获得下拉框的值后
,
需要根据我们在上节课定义的对象属性进行
sql
语句拼接
查询获得数据库数据
清空面板原有内容
,
生成新内容并添加到控件面板中
观察分析
,
两个下拉框的事件都是一致的
,
我们可以编写一个事件对象
eh
,
再为两个下拉框添加事件
,
设置事件对象为
eh
refreshData()
方法的由来
页面加载完成时
,
需要进行首页数据加载
两个下拉框改变
,
需要进行首页数据加载
搜索框输入文本后
,
需要对首页数据加载
因为这几个功能代码一致
,
于是我们封装了刷新首页数据的方法
,
逻辑如下:
定义
sql
语句用于拼接
获得类别下拉框的值
,
再判断之后进行
sql
语句拼接
EventHandler eh
=
a
->
{
//
刷新数据
refreshData
();
};
//
设置类别下拉框事件
cateCtl
.
setOnAction
(
eh
);
//
设置排序下拉框事件
orderCtl
.
setOnAction
(
eh
);
//
此处是需要被拼接的
sql
语句
String
sql
=
""
;
//
获得类别对象
Category item
=
cateCtl
.
getSelectionModel
().
getSelectedItem
();
//
对类别进行
sql
拼接
if
(
item
!=
null
&&
item
.
getId
()
!= -
1
) {
sql
+=
" and category_id="
+
item
.
getId
();
}
选中
全部
时
,
因为不满足条件
,sql
为
""
选中
食品
时
,
满足条件
,sql
为
and category_id=1
获得排序下拉框的值
,
再判断之后进行
sql
语句拼接
//
获得类别对象
Category item
=
cateCtl
.
getSelectionModel
().
getSelectedItem
();
//
对排序对象进行
sql
拼接
if
(
option
!=
null
&&
option
.
getValue
().
length
()
>
0
) {
sql
+=
" order by "
+
option
.
getValue
();
}
选中
全部
时
,
因为不满足条件
,sql
为
""
选中
时间升序
时
,
满足条件
,sql
为
order by create_time
清空中心面板内容
//
删除数据
vBox
.
getChildren
().
clear
();
获取到文本搜索框的值
String name = nameCtl.getText();
获取数据并显示内容
此段代码就是上节课编写的
,
相当于剪切过来了
//
生成商品展示内容
goodsDao
.
list
(
name
,
sql
).
forEach
(
g
->
{
TitledPane titlePane
=
new
TitledPane
();
titlePane
.
setText
(
g
.
getName
());
titlePane
.
setExpanded
(
false
);
titlePane
.
setCollapsible
(
true
);
titlePane
.
setPrefWidth
(
500
-
20
);
BorderPane borderPane
=
new
BorderPane
();
titlePane
.
setContent
(
borderPane
);
Image image
=
new
Image
(
"file:"
+
g
.
getCover
());
ImageView imageView
=
new
ImageView
(
image
);
imageView
.
setFitWidth
(
80
);
imageView
.
setFitHeight
(
80
);
borderPane
.
setLeft
(
imageView
);
Label l1
=
new
Label
(
"
商品价格
: "
+
g
.
getPrice
().
toString
());
Label l2
=
new
Label
(
"
商品描述
: "
+
g
.
getDescription
().
toString
());
Label l3
=
new
Label
(
"
商品创建时间
: "
+
g
.
getCreateTime
().
toString
());
Button buy
=
new
Button
(
"
购买
"
);
Button car
=
new
Button
(
"
添加购物车
"
);
HBox h1
=
new
HBox
(
buy
,
car
);
h1
.
setSpacing
(
3
);
VBox v1
=
new
VBox
(
l1
,
l2
,
l3
,
h1
);
v1
.
setSpacing
(
5
);
borderPane
.
setCenter
(
v1
);
vBox
.
getChildren
().
add
(
titlePane
);
});
完整代码
public
void
refreshData
() {
String
sql
=
""
;
//
获得类别
Category item
=
cateCtl
.
getSelectionModel
().
getSelectedItem
();
//
获得排序规则
Option option
=
orderCtl
.
getSelectionModel
().
getSelectedItem
();
if
(
item
!=
null
&&
item
.
getId
()
!= -
1
) {
sql
+=
" and category_id="
+
item
.
getId
();
}
if
(
option
!=
null
&&
option
.
getValue
().
length
()
>
0
) {
sql
+=
" order by "
+
option
.
getValue
();
}
//
删除数据
vBox
.
getChildren
().
clear
();
String
name
=
nameCtl
.
getText
();
//
生成商品展示内容
goodsDao
.
list
(
name
,
sql
).
forEach
(
g
->
{
TitledPane titlePane
=
new
TitledPane
();
titlePane
.
setText
(
g
.
getName
());
titlePane
.
setExpanded
(
false
);
titlePane
.
setCollapsible
(
true
);
titlePane
.
setPrefWidth
(
500
-
20
);
BorderPane borderPane
=
new
BorderPane
();
titlePane
.
setContent
(
borderPane
);
Image image
=
new
Image
(
"file:"
+
g
.
getCover
());
ImageView imageView
=
new
ImageView
(
image
);
imageView
.
setFitWidth
(
80
);
imageView
.
setFitHeight
(
80
);
borderPane
.
setLeft
(
imageView
);
Label l1
=
new
Label
(
"
商品价格
: "
+
g
.
getPrice
().
toString
());
Label l2
=
new
Label
(
"
商品描述
: "
+
g
.
getDescription
().
toString
());
Label l3
=
new
Label
(
"
商品创建时间
: "
+
g
.
getCreateTime
().
toString
());
Button buy
=
new
Button
(
"
购买
"
);
Button car
=
new
Button
(
"
添加购物车
"
);
HBox h1
=
new
HBox
(
buy
,
car
);
h1
.
setSpacing
(
3
);
VBox v1
=
new
VBox
(
l1
,
l2
,
l3
,
h1
);
首页搜索框功能
这个功能使用点击事件不好制作
,
我们可以思考以下选择上面的哪个事件
?
输入会涉及到键盘
,
于是我们可以选择键盘事件中的
setOnKeyReleased
键盘松开事件
首页的三个功能都是一致的
,
只需要设置事件对象为
eh
就行了
Dao
包方法
主要进行模糊查询以及
sql
拼接查询
v1
.
setSpacing
(
5
);
borderPane
.
setCenter
(
v1
);
vBox
.
getChildren
().
add
(
titlePane
);
});
}
nameCtl
.
setOnKeyReleased
(
eh
);
public
List
<
Goods
>
list
(
String
name
,
String
sql
) {
List
<
Goods
>
list
=
new
ArrayList
<
Goods
>
();
try
{
con
=
DBHelper
.
getCon
();
ps
=
con
.
prepareStatement
(
"select * from goods where name like ? "
+
sql
);
ps
.
setString
(
1
,
"%"
+
name
+
"%"
);
rs
=
ps
.
executeQuery
();
while
(
rs
.
next
()) {
//...
省略一万行代码
}
}
catch
(
Exception e
) {
e
.
printStackTrace
();
}
finally
{
DBHelper
.
close
(
con
,
ps
,
rs
);
}
return
list
;
}
至此
,
首页功能制作完成
考虑去实现:增加商品时
,
如果商品名称重复
,
则提示用户该名称不可用