如何避免拖拽大ScaleImageButton时误放到GlassPane面板?
解决方案
核心思路:避免在已有拖拽操作时触发小SIB的turnOnDrop()
问题根源是拖拽大SIB时,指针处于按下状态碰到小SIB,触发其PointerPressedListener并错误开启GlassPane的DropTarget。最极简的修复方式是在小SIB的按压事件中先判断当前是否已有活跃的拖拽操作,仅当无拖拽时才执行turnOnDrop()。
代码修改(每个小SIB仅需添加一行判断)
将小SIB的PointerPressedListener修改为:
blbl.addPointerPressedListener((e) -> { // 仅当无活跃拖拽时才开启DropTarget if (!DragManager.getInstance().isDragging()) { turnOnDrop(); } });
为什么这能解决问题?
DragManager.getInstance().isDragging()会返回当前是否有组件处于拖拽状态。拖拽大SIB时该方法返回true,小SIB的按压事件会直接跳过turnOnDrop()的执行,避免GlassPane的DropTarget被错误开启。- 该修改仅需给每个小SIB的监听器添加一行判断,代码量极少,完全符合你对代码量的限制。
备选方案(若DragManager方法不适用)
如果环境中DragManager的isDragging()无法正常工作,可通过事件类型判断排除拖拽过程中的触发:
blbl.addPointerPressedListener((e) -> { // 排除拖拽过程中触发的按压事件 if (!e.isDragEvent()) { turnOnDrop(); } });
内容的提问来源于stack exchange,提问作者curtjacobs1
相关产品推荐
相关产品推荐

