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