2010-02-17 59 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岩石...

歡呼聲..