等待光标并禁用 java 应用程序

2023-12-10

我想让用户按下按钮来启动后台线程。

当线程正在处理时,我希望发生两件事:

1) 应显示 WAIT_CURSOR。

2) 应用程序不应响应鼠标事件。

根据setCursor 文档“当该组件的 contains 方法针对当前光标位置返回 true 时,将显示该光标图像,并且该组件可见、可显示且已启用。”。

我希望在处理此后台线程时禁用我的应用程序。

有什么想法如何获得我想要的功能吗?

import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class WaitCursor extends JFrame
{
    private static final long    serialVersionUID    = 1L;

    public WaitCursor()
    {
        setResizable(false);

        setName(getClass().getSimpleName());
        setTitle("My Frame");
        setSize(300, 300);

        getContentPane().add(new MyButtonPanel());

    }

    private class MyButtonPanel extends JPanel
    {

        private static final long    serialVersionUID    = 1L;

        public MyButtonPanel()
        {
            JButton btnStart = new JButton("Start");
            btnStart.addActionListener(new BtnStartActionListener());
            add(btnStart);
        }

        private class BtnStartActionListener implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                // Change to WAIT_CURSOR
                Component root = SwingUtilities.getRoot((JButton) e.getSource());
                JOptionPane.showMessageDialog(root, "Wait 10 seconds");
                root.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

                // TODO: Disabling the root component prevents the WAIT_CURSOR from being displayed
                root.setEnabled(false);
                new Thread(new TimeKiller(root)).start();
            }
        }
    }

    private class TimeKiller implements Runnable
    {
        Component    _root;

        public TimeKiller(Component root)
        {
            _root = root;
        }

        public void run()
        {
            try
            {
                Thread.sleep(10 * 1000);
            }
            catch (InterruptedException e)
            {
                // Ignore it
            }
            // Change back to DEFAULT CURSOR
            JOptionPane.showMessageDialog(_root, "Done waiting");
            _root.setCursor(Cursor.getDefaultCursor());
            _root.setEnabled(true);
        }
    }

    private static void createAndShowGUI()
    {
        // Create and set up the window.
        WaitCursor frame = new WaitCursor();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    createAndShowGUI();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    System.exit(0);
                }
            }
        });
    }

}

禁用它的一种方法是使用玻璃窗格来阻止鼠标输入。

例如:

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;

import javax.swing.*;

@SuppressWarnings("serial")
public class WaitCursor2 extends JPanel {

   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private JComponent glassPane;
   private JButton runBackgroundProcBtn;
   private JTextArea textarea = new JTextArea(15, 30);

   public WaitCursor2(JComponent glassPane) {
      this.glassPane = glassPane;
      glassPane.setFocusable(true);
      glassPane.addMouseListener(new MouseAdapter() {
      }); // so it will trap mouse events.

      add(new JTextField(10));
      add(runBackgroundProcBtn = new JButton(new AbstractAction(
            "Run Background Process") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            runBackgroundProcessAction();
         }
      }));
      add(new JScrollPane(textarea));
   }

   private void runBackgroundProcessAction() {
      disableSystem(true);
      glassPane.setVisible(true);
      new SwingWorker<Void, Void>() {
         @Override
         protected Void doInBackground() throws Exception {
            long sleepTime = 5000;
            Thread.sleep(sleepTime);
            return null;
         }

         @Override
         protected void done() {
            disableSystem(false);
         }
      }.execute();
   }

   public void disableSystem(boolean disable) {
      glassPane.setVisible(disable);
      runBackgroundProcBtn.setEnabled(!disable);
      if (disable) {
         System.out.println("started");
         glassPane.requestFocusInWindow(); // so can't add text to text components
         glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      } else {
         System.out.println("done");
         glassPane.setCursor(Cursor.getDefaultCursor());
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("WaitCursor2");
      WaitCursor2 mainPanel = new WaitCursor2((JComponent) frame.getGlassPane());

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

如果玻璃窗格设置为可见并给定了 MouseListener,它将捕获鼠标事件。如果将其设置为隐形,它将失去其能力。同样,如果您使其可聚焦并赋予其焦点,它会将插入符号从文本组件中拉出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待光标并禁用 java 应用程序 的相关文章

随机推荐

  • 关闭控制台时出现 Python Matplotlib 运行时错误

    我正在尝试使用 matplotlib 在 python tkinter 上创建条形图 一切正常 除了当我关闭 tkinter console 窗口时 它给我这条消息 在关闭控制台之前我已经关闭了 tkinter 窗口 所以我不确定它指的是哪
  • 没有 jQuery 的 JavaScript 幻灯片

    我希望有与 jQuery Slidedown 类似的效果 但是without使用 jQuery 或任何其他库 我知道这是 可能的 因为 jQuery 中的任何事情都可以用纯 JavaScript 完成 只是更难 我不能使用 jQuery 因
  • WPF DataGridComboBoxColumn 不起作用

    我有一个DataGridComboBoxColumn in a DataGrid in a WPF项目设置如下
  • textarea onclick 删除文本

    我知道如何删除简单的 html 文本框中的文本 但 html 文本区域似乎要复杂得多 您可以将文本放在以下位置之间 而不是 value 属性
  • boost::property_tree::info_parser 在值中的空格处中断

    我面临一个问题 我有一个配置文件 我用 boost property tree info parser 解析它 我使用这段代码来完成这项工作 struct Config std string info 2 boost property tr
  • 网页脚本和内容脚本以及main.js(附加代码)脚本之间的通信[重复]

    这个问题在这里已经有答案了 UPDATE 抱歉 这个例子有效 我发现了一个小错误并在我的完整源代码中修复了 但我还是希望比我更了解的人能够很好地回答这个关于如何实现网页脚本和内容脚本以及main js 附加代码 脚本之间的通信的问题 还请回
  • 使用amazonSNS移动推送时如何确认配送状态?

    我正在使用 AmazonSNS 将推送消息发送到 IOS 设备 我已经得到带有 messageID 的publishResult 有什么办法可以使用这个messageID来检查传递状态吗 无法确认消息是否已送达 但是 看起来有一种方法可以在
  • Array() = range().value

    I saw array range value在一个例子中 我试图理解它是如何工作的 Sub test Dim arr As Variant arr Range E5 E7 Value For i 0 To UBound arr Debug
  • Excel VBA 中的 for 循环

    我正在尝试在 Excel 列上使用 For 循环 这是我的代码 For Each c In Worksheets sheet1 Range A1 A5000 Cells c Offset 0 1 Range A1 Value Right L
  • Linq连接iquery,如何使用defaultifempty

    我写了一个 linq 连接查询 如果其中一个为空 我想获取这些值 Code var Details UnitOfWork FlightDetails Query Join PassengersDetails x gt x Flightno
  • Angular CLI 不会创建新项目

    我正在尝试通过 Angular cli 创建一个项目 名为 ngadmin 但它会在此命令上引发错误 ng new ngadmin 错误是 fs 不支持重新评估本机模块源 如果你是 使用graceful fs模块 请将其更新到更新版本 版本
  • 将文本拆分为段落 NLTK - nltk.tokenize.texttiling 的用法?

    我正在寻找将文档分成段落的方法 我遇到了文本平铺作为一种可能的方法来做到这一点 这是我使用它的尝试 但是 我不明白如何处理输出 我很感激你的帮助 t unidecode doclist 0 decode utf 8 ignore nltk
  • 如何从数据库中随机检索问题?

    我有以下代码
  • 从 HTTP 切换到 HTTPS,失去了所有 Facebook“点赞”

    切换到 https 后 我们所有的文章都失去了 Facebook 的 点赞 计数 因此 我想仅对我们网站的内容区域禁用 https 该区域位于 content php 文章采用 content php 212 My Article 的形式
  • 检查自定义 Twig 函数是否存在,然后调用它

    我测试是否存在自定义 Twig 函数 if methodExist sg datatables render sg datatables render datatable else datatable render datatable en
  • Webview 的 loadData() 在 android 10.0 中不起作用(Q)

    这里我试图将 Html 代码作为字符串加载到 webview 中loadData 此方法没有发生任何事情 但相同的方法在低于 sdk 29 中像魅力一样工作 webview loadData html code text html null
  • Beam/Dataflow 中的批量 PCollection

    我在 GCP Dataflow Apache Beam 中有一个 PCollection 我不需要一一处理 而是需要 按N 组合 就像是grouped N 因此 在有界处理的情况下 它将按批次中的 10 个项目和最后一批中剩余的项目进行分组
  • Java + SSH + Postgres

    我们正在实施一个大学项目 Java 的拼车服务 我们需要解决一个与 如何管理 postgres 服务器 相关的问题 PostgreSQL 数据库配置在名为 golem 130 136 4 sth 的实验室服务器中 只能通过同一子网 130
  • 关于Scala变量可变性的问题

    我明白那个val关键字确定基础变量是不可变类型 以后不能重新分配 现在我在 scala 编程中遇到了一段 第 3 章 scala 中的后续步骤 用类型参数化数组 它指出 val greetStrings Array String new A
  • 等待光标并禁用 java 应用程序

    我想让用户按下按钮来启动后台线程 当线程正在处理时 我希望发生两件事 1 应显示 WAIT CURSOR 2 应用程序不应响应鼠标事件 根据setCursor 文档 当该组件的 contains 方法针对当前光标位置返回 true 时 将显