如何为FXtras Agenda单个约会设置allowDragging属性而非全局设置
实现JFXtras Agenda单个约会的拖拽权限控制
我之前刚好碰到过和你一模一样的需求,用的也是JFXtras 8.0-r5的Agenda组件,给你分享个亲测可行的方案:
因为Agenda的allowDragging是全局开关,要实现单个约会的拖拽控制,我们可以先开启全局拖拽,再通过事件拦截来限制特定分组的约会,具体步骤如下:
首先开启全局拖拽功能
把Agenda的allowDragging设为true,这样所有约会默认具备拖拽的基础能力,之后我们再针对特定分组做限制。拦截拖拽启动事件
给Agenda添加DRAG_DETECTED事件监听器,这个事件是拖拽开始前的检测阶段,我们在这里判断当前选中的约会属于哪个分组:- 如果是
group2(shared约会),就消耗掉事件,阻止拖拽启动; - 如果是
group1(personal约会),就执行默认的拖拽初始化逻辑。
- 如果是
下面是完整的代码示例:
Agenda agenda = new Agenda(); // 开启全局拖拽 agenda.setAllowDragging(true); // 添加拖拽检测事件监听器 agenda.addEventHandler(DragEvent.DRAG_DETECTED, event -> { // 获取当前选中的约会(Agenda在拖拽前会选中要拖拽的约会) Optional<Agenda.Appointment> selectedAppt = agenda.appointments() .filtered(Agenda.Appointment::isSelected) .stream() .findFirst(); if (selectedAppt.isPresent()) { Agenda.Appointment appt = selectedAppt.get(); // 判断约会所属分组,阻止group2的约会拖拽 if ("group2".equals(appt.getGroup())) { event.consume(); } else { // 允许group1的约会进行拖拽,触发默认拖拽逻辑 agenda.startFullDrag(); } } });
原理说明
这个方案的核心是利用事件传播机制:先让全局拖拽功能生效,然后在拖拽行为的起始阶段就拦截掉不允许的操作。这样group1的约会可以正常拖拽调整时间,group2的约会用户根本没法触发拖拽操作,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Lost
相关产品推荐
相关产品推荐

