1

クライアント サーバー アプリケーションがあり、クライアント側でスイングを使用しています。私のスイング クライアントには、1 つのメイン ウィンドウ (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);

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 を最上位コンポーネントにすることができません。

何か案が?

ありがとう。

4

2 に答える 2

1

コードが機能していることに気付きましたが、問題はスレッドに関連しています。私のコードは次のようなものでした:

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_cursorに変更されません。メインフレームを無効にしないと、カーソルは変更されますが、イベントはキューに入れられます。

乾杯...

于 2010-02-18T10:14:30.630 に答える
1

スイングスレッドの問題を数日掘り下げた後、最終的に本当の答えを見つけました:SwingWorker

今、私の最終的なコードは次のようなものです

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

startWaitCursor() メソッドで、グラスペインを表示 (アルファ値の背景) に設定し、ユーザーに時間のかかる作業を行っていることを警告するメッセージを表示し、カーソルを wait_cursor (砂時計) に設定し、すべてのキー、マウス イベントを消費します。それだ。

また、SwingWorker を使用することで、クライアントは実際に応答します (サーバー要求が行われていないかのように動作します) が、ガラスペインを表示し、すべてのキー イベントとマウス イベントを消費するため、応答しないように感じます。

なんという安堵.. SwingWorker は揺るぎない..

乾杯..

于 2010-02-21T13:16:27.480 に答える