使用glasspane从swing组件中删除鼠标事件/控件

使用glasspane从swing组件中删除鼠标事件/控件,swing,cursor,glasspane,Swing,Cursor,Glasspane,我有一个客户机-服务器应用程序,在客户端使用swing。我的swing客户端有一个主窗口(jframe)和许多面板、工具栏和菜单栏。 我想在客户端通过glasssPane等待服务器响应时删除所有客户端操作/鼠标事件(或者简单地抓取,什么也不做)。 以下是我编写的代码: private final static MouseAdapter mouseAdapter = new MouseAdapter() { public void mouseClicked(MouseEvent e)

我有一个客户机-服务器应用程序,在客户端使用swing。我的swing客户端有一个主窗口(jframe)和许多面板、工具栏和菜单栏。 我想在客户端通过glasssPane等待服务器响应时删除所有客户端操作/鼠标事件(或者简单地抓取,什么也不做)。 以下是我编写的代码:

private final static MouseAdapter mouseAdapter = new MouseAdapter() 
{
  public void mouseClicked(MouseEvent e) 
  {
   System.out.println("MouseClicked..!");
  }
 };

private static Cursor WAIT_CURSOR = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
private static Cursor DEFAULT_CURSOR = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);

但我无法管理抓取鼠标事件。在glassPane上更改光标效果很好,但我无法添加mouseAdapter,或者无法使glasssPane成为顶级组件

有什么想法吗


谢谢。

我意识到我的代码正在工作,但我的问题与线程有关。我的代码是这样的:

startWaitCursor(); 
work(); // server request that takes time 
stopWaitCursor();
并将其更改为:

startWaitCursor(); 
SwingUtilities.invokeLater(new Runnable() {
poblic void run() { 
try 
{ 
work(); // server request 
} 
finally 
{ 
stopWaitCursor(); 
}
通过进行此修改,我可以看到在客户端等待服务器响应时在startWaitCursor()方法中所做的设置

但还是有一个小问题。在startWaitCursor()方法中,我删除了玻璃窗格的键、鼠标和焦点事件,但即使显示玻璃窗格,事件仍由主框架捕获

addMouseListener(new MouseAdapter() {});
addMouseMotionListener(new MouseMotionAdapter() {});
addKeyListener(this);
setFocusTraversalKeysEnabled(false);
在服务器响应到达客户机并调用stopWaitCursor()方法后,将在主框架中处理事件

如果我在客户端等待时禁用了应用程序的主框架,则游标不会更改为wait\u cursor;如果我没有禁用主框架,则游标会更改,但事件会排队


干杯…

经过几天的研究,我终于找到了真正的答案:

现在我的最终代码是这样的

startWaitCursor();
SwingWorker worker = new SwingWorker() {
   public Object doInBackground() 
   {
      doWork(); // time consuming server request
      return null;
   }
   public void done() 
   {
      stopWaitCursor();
   }
};
worker.execute();
在startWaitCursor()方法中,我将glasspane设置为可见(背景为alpha值),显示一条消息以警告用户正在执行耗时的作业,将光标设置为等待光标(沙漏),并使用所有按键、鼠标事件。就是这样

通过使用SwingWorker,我的客户机实际上是有响应的(就像没有服务器请求一样工作),但由于我显示了glasspane并使用了所有按键和鼠标事件,这让我感觉不负责任

真令人宽慰。。SwingWorker rocks


干杯..

为代码博客的时髦外观感到抱歉。我意识到我无法将glassPane设置为最上面的组件。我将玻璃窗格的背景色设置为粉红色,不透明设置为true,但我没有看到背景色。如果glassPane不是最上面的元素,那么光标的变化就更大了。我意识到mu代码正在工作,但我的问题与线程相关。我的代码类似于:startWaitCursor();work();//需要时间的服务器请求stopWaitCursor();并将其更改为:startWaitCursor();SwingUtilities.invokeLater(新Runnable(){poblic void run(){try{work();//server request}最后{stopWaitCursor();}通过进行此修改,我可以在客户端等待服务器响应时看到我在startWaitCursor()方法中所做的设置。干杯。。。
startWaitCursor();
SwingWorker worker = new SwingWorker() {
   public Object doInBackground() 
   {
      doWork(); // time consuming server request
      return null;
   }
   public void done() 
   {
      stopWaitCursor();
   }
};
worker.execute();