Java拖放自定义光标

2023-12-03

我使用 JPanel 定义了一个自定义画布样式组件,它将支持将对象拖动到画布上。我似乎无法弄清楚如何使用 TransferHandler 将拖放 (DnD) 光标更改为自定义光标。例如,我想用我自己的代替 DnD 期间的默认链接光标。有没有办法使用 TransferHandler 来做到这一点?

我怀疑我将不得不使用 AWT DnD 支持来执行此操作,但我希望尽可能避免这种情况。


通过深入研究 TransferHandler 代码,我找到了解决方法。 DragOver 方法是我更改光标的地方。我仍然认为我可能会错过一些简单的东西,但现在这会起作用。

这两个静态类以及exportAsDrag 中的代码是对TransferHandler 源代码进行细微修改的副本。

EDIT- 我就是这样解决的。希望这可以帮助。欢迎提出建议。

    public class OverrideIconTransferHandler extends TransferHandler {
    private class MyDragGestureRecognizer extends DragGestureRecognizer {

        private static final long serialVersionUID = 1L;

        MyDragGestureRecognizer(DragGestureListener dgl) {
            super(DragSource.getDefaultDragSource(), null, NONE, dgl);
        }

        void gestured(JComponent c, MouseEvent e, int srcActions, int action) {
            setComponent(c);
            setSourceActions(srcActions);
            appendEvent(e);
            fireDragGestureRecognized(action, e.getPoint());
        }

        @Override
        protected void registerListeners() {
        }

        @Override
        protected void unregisterListeners() {
        }

    }

    private class MyDragHandler implements DragGestureListener, DragSourceListener {

        private boolean scrolls;

        @Override
        public void dragDropEnd(DragSourceDropEvent dsde) {
            DragSourceContext dsc = dsde.getDragSourceContext();
            JComponent c = (JComponent) dsc.getComponent();
            if (c.getTransferHandler() instanceof OverrideIconTransferHandler) {
                OverrideIconTransferHandler t = (OverrideIconTransferHandler) c.getTransferHandler();
                if (dsde.getDropSuccess()) {
                    t.exportDone(c, dsc.getTransferable(), dsde.getDropAction());
                } else {
                    t.exportDone(c, dsc.getTransferable(), NONE);
                }
            }
            c.setAutoscrolls(scrolls);
        }

        @Override
        public void dragEnter(DragSourceDragEvent dsde) {
        }

        @Override
        public void dragExit(DragSourceEvent dsde) {
        }

        @Override
        public void dragGestureRecognized(DragGestureEvent dge) {
            JComponent c = (JComponent) dge.getComponent();
            if (c.getTransferHandler() instanceof OverrideIconTransferHandler) {
                OverrideIconTransferHandler th = (OverrideIconTransferHandler) c.getTransferHandler();
                Transferable t = th.createTransferable(c);
                if (t != null) {
                    scrolls = c.getAutoscrolls();
                    c.setAutoscrolls(false);
                    try {
                        Image im = th.getDragImage();
                        if (im == null) {
                            dge.startDrag(null, t, this);
                        } else {
                            dge.startDrag(null, im, th.getDragImageOffset(), t, this);
                        }
                        return;
                    } catch (RuntimeException re) {
                        c.setAutoscrolls(scrolls);
                    }
                }

                th.exportDone(c, t, NONE);
            }
        }

        @Override
        public void dragOver(DragSourceDragEvent dsde) {
            if (dropCursorOverrides.containsKey(dsde.getDropAction())) {
                dsde.getDragSourceContext().setCursor(dropCursorOverrides.get(dsde.getDropAction()));
            } else {
                dsde.getDragSourceContext().setCursor(null);
            }
        }

        @Override
        public void dropActionChanged(DragSourceDragEvent dsde) {
        }
    }

    private static final long serialVersionUID = 1L;
    private MyDragGestureRecognizer myRecognizer = null;
    private final Map<Integer, Cursor> dropCursorOverrides = new HashMap<>();

    public void addDropCursorOverride(final int action, final Cursor cursor) throws IllegalArgumentException {
        if (!(action == COPY || action == MOVE || action == LINK || action == NONE)) {
            throw new IllegalArgumentException("Unknown Action Type");
        }
        dropCursorOverrides.put(action, cursor);
    }

    @Override
    public void exportAsDrag(JComponent comp, InputEvent e, int action) {
        if (comp.getTransferHandler() instanceof OverrideIconTransferHandler) {
            int srcActions = getSourceActions(comp);

            if (!(e instanceof MouseEvent) || !(action == COPY || action == MOVE || action == LINK) || (srcActions & action) == 0) {

                action = NONE;
            }

            if (action != NONE && !GraphicsEnvironment.isHeadless()) {
                if (myRecognizer == null) {
                    myRecognizer = new MyDragGestureRecognizer(new MyDragHandler());
                }
                myRecognizer.gestured(comp, (MouseEvent) e, srcActions, action);
            } else {
                exportDone(comp, null, NONE);
            }
        } else {
            super.exportAsDrag(comp, e, action);
        }
    }

    public void removeDropCursorOverride(final int action) throws IllegalArgumentException {
        if (!(action == COPY || action == MOVE || action == LINK || action == NONE)) {
            throw new IllegalArgumentException("Unknown Action Type");
        }
        dropCursorOverrides.remove(action);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java拖放自定义光标 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 吉他调音器频率

    我正在为 iOS 制作一个吉他调音器Objective C 由于事实上我是Beginner我正在努力收集有关它的所有资源和信息 我知道这个理论 如果我错了 请纠正我 首先我需要从麦克风获取输入 然后需要申请申请FFT获取频率的算法 然后比较
  • ASP.NET C# 添加/更新用户到角色

    大家好 我有一个页面显示住宿信息 然后显示在详细信息视图中创建该信息的人的用户 ID 我还有一个按钮 应该查看该用户 ID 单击该按钮时将该用户 ID 转换为用户名 以便我可以使用该用户名将人员角色更改为租户 但是我不确定使用 C 如何从详
  • LINQ 与 SPARQL 的比较? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我不是 MS NET 用户 但对 LINQ 感到好奇 这篇文章http www linqpad net WhyLINQBeatsSQL aspx很好地解释了为什么它比 SQL 更
  • 功能请求:gwan.h 中包含的atomicAdd() 函数

    在 G WAN KV 选项中 KV INCR KEY将使用第一个字段作为主键 这意味着 G WAN 核心中已经内置了一个以原子方式递增的函数 以使该主索引正常工作 最好将此函数开放给 servlet 使用 即包含在 gwan h 中 通过这
  • 如何在div上叠加图像?

    我想在边框上放置一个小的圆形登录图像div这样半个图像将在边界线之外只是为了样式目的 我想我必须设置 z index 但如何或有没有更好的方法 这正是您需要做的 给你 img 一个类名 然后在你的样式表中添加类似这样的内容 classnam
  • 有什么方法可以在 JavaScript 中识别浏览器选项卡吗?

    我需要能够识别我在浏览器中的哪个选项卡 难道我不能从浏览器中获取一些信息来识别该选项卡吗 我不需要知道任何其他选项卡的任何信息 我只需要我所在选项卡的 id 它可以是随机数或序列号 也可以是日期时间戳 只要它与当前选项卡保持不变即可 选项卡
  • 是否可以通过 api 获取提交更改(仅限差异)?

    我试图通过 api 提取提交更改 而我得到的只是文件本身的路径 就像整个文件一样 我想要实现的是查看每次提交的单个文件的更改 仅差异 例如 如果我使用 Github 查询相同的内容 我会得到如下的差异 1 0 0 n console log
  • 如何提高单字符PrefixQuery性能?

    我有一个包含 150 万个文档的 RAMDirectory 并且我正在使用 PrefixQuery 搜索单个字段 当搜索文本长度为3个或更多字符时 搜索速度极快 不到20毫秒 但当搜索文本长度小于 3 个字符时 搜索甚至可能需要整整 1 秒
  • 有没有办法在 WPF 中创建粘性页脚?

    我想在 WPF 中添加粘性页脚 这是我在这个主题上发现的唯一问题 有没有办法在 xaml 中创建粘性页脚 但答案创造了一个fixed页脚 不是sticky footer
  • 如何组合列数略有不同的多个表

    我有多个表 其中大约有 10 个公共列 但有些表有 1 2 个额外列 我想将所有这些表组合成一个表 每个表中的每一行都有一行 每个特定行的源表中不存在的任何列都具有 NULL 值 所以我的输入大致如下 table1 id colA colB
  • NSDate:处理一天中时间的正确方法?

    我正在制定指定一天中不同时间的时间表 例如上午 10 30 不过 我不知道日期 我将把这些作为值存储在NSDictionary并希望以直接的方式处理他们 我不能使用NSDate 因为我没有约会 至少 不是以一种直接的方式 另一种看似显而易见
  • unionWith 的终止检查

    我在终止检查时遇到问题 与中描述的问题非常相似这个问题还有这个Agda 错误报告 功能请求 问题是让编译器相信以下内容unionWith终止 使用重复键的组合功能 unionWith合并表示为按键排序的 键 值 对列表的两个映射 有限映射的
  • Netlogo 发芽的海龟间隔不到一处

    我想将海龟放置在每个黑色斑块上 下图 这样海龟之间就没有间隙 我现在使用的代码 ask patches with pcolor black sprout dead turtles wall agents set color red 这给出了
  • 使用分治法求一个数的n次方根

    我需要有关如何求某个数字的 n 次方根的帮助 用户输入数字 n 和他想要根的数字 我需要在没有 cmath lib 的情况下使用分而治之的方法来解决这个问题 这是我的代码 目前还无法运行 include
  • 如何从C#调用Java代码?

    我们开发了一个 Java 应用程序 并希望从 C 客户端使用该应用程序 该应用程序依赖于 Spring Log4j 最有效的机制是什么 从 Java 代码创建 DLL 来实现这一目标 IKVM 真是太棒了 唯一的问题是它确实为项目增加了约
  • ScrollViewer 不滚动

    我想要一个包含 3 个组件的界面 一个挨着一个 第一个是 ListView 另外两个是 Grid 由于组件会在右侧溢出 因此我想将它们放在 ScrollViewer 中 我没有成功 我尝试做一个非常简单的例子来尝试 但即使这个例子也失败了
  • 是 printf("%d %d", c++, c); 的输出结果也未定义?

    最近看到一个帖子cout 并想知道是否输出 int c 0 printf d d c c 也是未定义的 我在讲座中研究过后缀和前缀运算符仅在获得分号后才增加值 所以根据我的说法 输出0 0是正确的 我在讲座中研究过后缀和前缀运算符仅在获得分
  • codeigniter 中的浏览器缓存问题

    我是代码点火器的新手 我创建了一个登录表单和一个注销部分 当我按下注销部分时 页面将重定向到登录部分 当我单击浏览器中的后退按钮时 它将显示以前的页面 当我单击清除最近历史记录和选择缓存 然后按后退按钮时 它不会显示最近的页面 它只显示登录
  • Glassfish 上的 Spring Boot

    我在 Spring Boot 部署到 GF3 4 期间得到了这个 虽然这是知道问题看到 弹簧启动问题 another 除了 GF 源代码中的 try catch 破解之外 没有其他解决方案 整个问题是关于 Conditional Sprin
  • Java拖放自定义光标

    我使用 JPanel 定义了一个自定义画布样式组件 它将支持将对象拖动到画布上 我似乎无法弄清楚如何使用 TransferHandler 将拖放 DnD 光标更改为自定义光标 例如 我想用我自己的代替 DnD 期间的默认链接光标 有没有办法