JavaFX事件

目标
事件介绍
事件应用
概述
本次课程 , 我们将讲解 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 ;
} 至此 , 首页功能制作完成
考虑去实现:增加商品时 , 如果商品名称重复 , 则提示用户该名称不可用
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值