0

私のアプリは、JFrame を開く JApplet です。アプレットにはリスナーとボタンがあるため、フレームが別のウィンドウの背後にある (フォーカスを失った) 場合、ユーザーはボタンをクリックするだけでウィンドウを前面に出すことができます。 frame.toFront();これはうまくいきます。

しかし、最初に (アプレットの でpublic void init() {})、呼び出した後、frame.setVisible(true);を呼び出しframe.toFront();て、それが前に開始されることを確認します。ただし、フレームはすぐにブラウザーの背後に移動します。ただし、ボタンを押すとコールバックされます。繰り返し呼び出す別のスレッドを実行しようとしましたがframe.toFront(); 、これが停止するとすぐに、フレームはブラウザの後ろに移動します。ボタンを押したときだけ前面に出て、前面にとどまります。また、ループや時間を継続的に前に保持することは、ユーザーが意図的に遅れさせる必要があるか、または望む可能性があるため、適切なオプションではありません。この「バグ」は、Mac (Java 1.5 を実行) には存在しませんが、Windows (1.6 を実行) - IE、FF、Chrome、Safari を含みますが、Opera には (奇妙なことに) 存在しません。

考えられる原因と解決方法は?

4

2 に答える 2

0

setAlwaysOnTop(true)1 つの問題を解決しますが、別の問題を引き起こします。つまり、ユーザーが実際にウィンドウを背面に移動する方法がなくなります。

私の解決策はハックです: JFrame に接続されている WindowListener に、次のコードを配置します。

@Override
public void windowDeactivated(WindowEvent e)
{
  if(firstToBack)  //firstToBack is an bloolean instance variable initialized to true
  {
    final JFrame f = frame;
    new Thread() { public void run() {
      try { Thread.sleep(300); } catch(InterruptedException ie) {}  
      f.toFront();
    }}.start();
    firstToBack = false;
  } 
}

これは基本的に、最初に新しいスレッドを開始し、少し待ってから JFrame を前面に呼び出します。これは 1 回しか実行されないため、ユーザーがフレームを背面に送信するたびにフレームが前面に出てくるわけではありません。300 ミリ秒は任意の時間であり、おそらく必要でさえありません。

おそらく誰かがこれが機能する理由を教えてくれますが、同じ種類のスレッドがアプレットの init() メソッドから開始されたとき、スレッドが終了した後、ウィンドウはとにかく後ろに移動しましたか?

于 2009-10-22T15:44:26.973 に答える
0

フレームで setAlwaysOnTop(true) を試しましたか? ただし、これがアプレットから作成されたフレームまたはウィンドウで許可されているかどうかはわかりません。

于 2009-10-21T14:20:34.647 に答える