了解 JavaFX 里面的事件,同时完善一些对应的功能
事件介绍
何为 事件 ,在JavaFX应用程序中,事件用来通知一些事情发生了。当用户点击一个按钮、按下一个键、移动鼠标、或者执行其他的 操作,都会有事件会被派生出来。在应用程序中注册事件过滤器和事件处理器可以接收到事件并提供响应。
JavaFX 提供了处理各种事件的支持。 javafx.event.Event 类是事件的基类。
常用事件类型如下:
比较常用的事件
键盘事件
onKeyPressed 当节点具有焦点并按下键时将调用该函数。
onKeyReleased 当节点具有焦点并释放键时将调用该函数。
onKeyTyped 当节点具有焦点并键入键时将调用该函数。
鼠标事件
onMouseClicked 当在节点上单击鼠标按钮时将调用该函数。
onMouseEntered 当鼠标进入节点时将调用该函数。
onMouseExited 当鼠标退出节点时将调用该函数。
onMouseMoved 当鼠标在节点内移动并且没有按下按钮时将调用该函数。
onMousePressed 当在节点上按下鼠标按钮时将调用该函数。
onMouseReleased 当在节点上释放鼠标按钮时将调用该函数。
功能实现
首页下拉框功能
通过改变下拉框的值,从而改变首页的显示内容
分析: 给下拉框添加事件,在下拉框收到改变后触发 点击事件 setOnAction 获得下拉框的值后,需要根据我们在上节课定义的对象属性进行 sql 语句拼接 查询获得数据库数据 清空面板原有内容,生成新内容并添加到控件面板中 观察分析,两个下拉框的事件都是一致的,我们可以编写一个事件对象 eh ,再为两个下拉框添加事件,设置事件对象为 eh
EventHandler eh = a -> {
//刷新数据
refreshData();
};
//设置类别下拉框事件
cateCtl.setOnAction(eh);
//设置排序下拉框事件
orderCtl.setOnAction(eh);
refreshData() 方法的由来
页面加载完成时,需要进行首页数据加载
两个下拉框改变,需要进行首页数据加载 搜索框输入文本后,需要对首页数据加载 因为这几个功能代码一致,于是我们封装了刷新首页数据的方法,逻辑如下: 定义sql语句用于拼接
//此处是需要被拼接的sql语句
String sql = "";
获得类别下拉框的值,再判断之后进行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语句拼接
//删除数据
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);
v1.setSpacing(5);
borderPane.setCenter(v1);
vBox.getChildren().add(titlePane);
});
}
首页搜索框功能
这个功能使用点击事件不好制作,我们可以思考以下选择上面的哪个事件? 输入会涉及到键盘,于是我们可以选择键盘事件中的 setOnKeyReleased 键盘松开事件 首页的三个功能都是一致的,只需要设置事件对象为 eh 就行了
nameCtl.setOnKeyReleased(eh);
public List list(String name, String sql) {
List list = new ArrayList();
try {
con = DBHelper.getCon();
ps = con.prepareStatement("select * from goods where name like ? " + sql);
ps.setString(1, "%" + name + "%");
rs = ps.executeQuery();
while (rs.next()) {
goods goods=new goods();
goods.setId(rs.getInt(1));
goods.setName(rs.getString(2));;
goods.setCategoryId(rs.getInt(3));
goods.setPrice(rs.getDouble(4));
goods.setDescription(rs.getString(5));
goods.setCover(rs.getString(6));
goods.setCreateTime(rs.getDate(7));
list.add(goods);} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.close(con, ps, rs);
}
return list;
}