2010-02-17 52 views
1

我有一个客户端 - 服务器应用程序,我在客户端使用swing。我的swing客户端有一个主窗口(jframe)和很多面板,工具栏和菜单栏。 当客户端通过glasssPane等待来自服务器的响应时,我想要删除所有客户端动作/鼠标事件(或者简单地抓取并不执行任何操作)。 这里是我写的代码:使用glasspane从摆动组件中删除鼠标事件/控件

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); 

public static void startWaitCursor(JComponent comp) 
{ 
    MainWindow root = ((MainWindow) comp.getTopLevelAncestor()); 

    root.getGlassPane().setCursor(WAIT_CURSOR); 
    root.getGlassPane().addMouseListener(mouseAdapter); 
    root.getGlassPane().setVisible(true); 
} 

public static void stopWaitCursor(JComponent comp) 
{  
    MainWindow root = ((MainWindow) comp.getTopLevelAncestor()); 

    root.getGlassPane().setCursor(DEFAULT_CURSOR); 
    root.getGlassPane().setVisible(false); 
} 

但我不能够管理抓取鼠标事件。在glassPane中更改游标工作正常,但无论是我无法添加mouseAdapter还是无法使glasssPane成为顶级组件。

有什么想法?

谢谢。

+0

对不起,我的代码博客时髦的外观。 我意识到我无法将glassPane设置为最上面的组件。 我设置了背景颜色的玻璃板为粉红色和不透明为真,但我没有看到背景颜色。比如果glassPane不是光标变化的最顶层元素。 – Deger 2010-02-17 14:48:28

+0

我意识到亩代码正在工作,但我的问题是线程相关。我的代码是这样的: startWaitCursor(); work(); //需要花费时间的服务器请求 stopWaitCursor(); 并将其更改为: startWaitCursor(); SwingUtilities.invokeLater(Runnable的新(){ poblic无效的run(){ 尝试 { 工作(); //服务器的请求 } 终于 { stopWaitCursor();} 做此修改我在客户端正在等待来自服务器的响应时,可以看到我在startWaitCursor()方法中所做的设置。 干杯... – Deger 2010-02-18 09:59:47

回答

1

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

startWaitCursor(); 
work(); // server request that takes time 
stopWaitCursor(); 

,并把它改为:做此修改我可以看到我在startWaitCursor()方法制成,而客户端等待来自服务器的响应的设置

startWaitCursor(); 
SwingUtilities.invokeLater(new Runnable() { 
poblic void run() { 
try 
{ 
work(); // server request 
} 
finally 
{ 
stopWaitCursor(); 
} 

但是仍然存在一个小问题。在startWaitCursor()方法中,我为玻璃窗格设定了键,鼠标和​​焦点事件,但事件仍然由主框架捕获,即使显示glassPane。

addMouseListener(new MouseAdapter() {}); 
addMouseMotionListener(new MouseMotionAdapter() {}); 
addKeyListener(this); 
setFocusTraversalKeysEnabled(false); 

服务器响应到达客户端后,调用stopWaitCursor()方法在主框架中处理事件。

如果我在客户端等待时禁用了我的应用程序的主框架,而不是将游标更改为wait_cursor,如果我没有禁用主框架,则游标正在更改,但事件已排队。

欢呼声......

1

挖摇摆线程问题,几天后,我终于找到了真正的答案:SwingWorker

现在我的最终代码是一样的东西,

startWaitCursor(); 
SwingWorker worker = new SwingWorker() { 
    public Object doInBackground() 
    { 
     doWork(); // time consuming server request 
     return null; 
    } 
    public void done() 
    { 
     stopWaitCursor(); 
    } 
}; 
worker.execute(); 

在startWaitCursor ()方法我设置glasspane可见(带有alpha值的背景),显示一条消息来警告用户耗时的工作正在进行,将光标设置为wait_cursor(沙漏)并消耗所有键,鼠标事件。这就对了。

而且通过使用SwingWorker,我的客户端实际上是响应式的(它的工作方式好像没有服务器请求一样),但是由于我显示了glasspane并且消耗了所有键和鼠标事件,所以感觉像没有反应。

什么救济..的SwingWorker岩石...

欢呼声..