首页 > Java > java教程 > 为什么我的 Java 等待光标没有出现在自定义光标之上?

为什么我的 Java 等待光标没有出现在自定义光标之上?

Linda Hamilton
发布: 2024-11-24 19:31:13
原创
875 人浏览过

Why Doesn't My Java Wait Cursor Appear Over Custom Cursors?

Java 等待光标显示问题

问题:

在中显示等待光标时在 Java 应用程序中,如果鼠标位于定义了自己的光标的面板上,则光标不会出现。此问题在提供的示例自包含可执行文件 (SSCE) 中进行了演示。

原因:

Java 等待游标的默认实现仅影响直接设置在组件。具有自定义光标的面板优先,覆盖等待光标。

解决方案:

要解决此问题,应将等待光标设置在包含的 JFrame 的玻璃窗格上寻求显示的组件

实现:

  1. 创建一个动作监听器:

    • 安排一个任务来设置等待指定延迟后的光标。
    • 在延迟。
  2. 触发动作侦听器时:

    • 将等待光标设置在 JFrame 的玻璃窗格上。
    • 添加一个将鼠标适配器连接到 glasspane,以防止鼠标事件到达底层组件。
    • 制作 glasspane可见。
  3. 定时器任务完成时:

    • 将原始光标恢复到 JFrame。
    • 移除鼠标适配器从玻璃板上。
    • 隐藏glasspane。

修改后的 SSCE:

修改后的 SSCE 合并了这些更改,以确保即使面板有自定义,也会显示等待光标光标:

public class BusyCursorTest extends javax.swing.JFrame {

    private javax.swing.JPanel cursorPanel = null;

    // ... (remaining code)

    public static void main(String[] args) {
        new BusyCursorTest();
    }

    public static java.awt.event.ActionListener getActionListener(final javax.swing.JFrame frame,
        final java.awt.event.ActionListener originalActionListener) {

        java.awt.event.ActionListener actionListener = new java.awt.event.ActionListener() {

            public void actionPerformed(final java.awt.event.ActionEvent e) {

                java.util.TimerTask timerTask = new java.util.TimerTask() {

                    public void run() {
                        originalCursor = frame.getCursor();
                        startWaitCursor(frame);
                    }

                };
                java.util.Timer timer = new java.util.Timer();

                try {
                    timer.schedule(timerTask, DELAY_MS);
                    originalActionListener.actionPerformed(e);
                } finally {
                    timer.cancel();
                    stopWaitCursor(frame);
                }
            }

        };
        return actionListener;
    }

    private static void startWaitCursor(javax.swing.JFrame frame) {
        frame.getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR));
        frame.getGlassPane().addMouseListener(mouseAdapter);
        frame.getGlassPane().setVisible(true);
    }

    private static void stopWaitCursor(javax.swing.JFrame frame) {
        frame.getGlassPane().setCursor(originalCursor);
        frame.getGlassPane().removeMouseListener(mouseAdapter);
        frame.getGlassPane().setVisible(false);
    }

    // ... (remaining code)
}
登录后复制

以上是为什么我的 Java 等待光标没有出现在自定义光标之上?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板