ユーザーが IE ペインをクリックすると、IE のモーダル ダイアログが IE の背後に隠れる

StackOverflow https://stackoverflow.com/questions/73000

質問

パスワードダイアログを表示するアプレットを作成する必要があります。問題は、ダイアログが常に最前面に表示されるように設定されているにもかかわらず、ユーザーが IE ウィンドウをクリックすると、ダイアログが IE ウィンドウの後ろに隠れてしまうということです。そして、ダイアログはモーダルであり、保持されるため、 全て IE のスレッド IE ペインが更新されず、ダイアログ ウィンドウが IE の上に描画されたままになります (ただし、更新されません)。この動作はユーザーを混乱させます (ユーザーは 見る IE の上にダイアログが表示されますが、更新されていないためハングしているように見えます)。

したがって、そのダイアログをすべての最上位に保つ方法が必要です。しかし、この問題に対する他の解決策があれば良いでしょう。

コードは次のとおりです。

        PassDialog dialog = new PassDialog(parent);
        /* do some non gui related initialization */
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setAlwaysOnTop(true);
        dialog.setVisible(true);

解決:@shemnonが指摘したように、モーダルダイアログの親(null、フレーム、アプレット)の代わりにウィンドウを作成する必要があります。親を初期化する良い方法は次のとおりです。

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
役に立ちましたか?

解決

親にはどのような引数を使用していますか?

アプレットの親を使用すると、うまくいく可能性があります。

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

getWindowAncestor を使用すると、アプレットの親がスキップされます (getRoot(component) はアプレットを返します)。Java の少なくとも一部のバージョンには、IE ウィンドウと同等の Frame がありました。YMMV。

他のヒント

Dialog 上で 2 秒ごとに toFront を呼び出すバックグラウンド スレッドを作成します。使用するコード (すべて理解できていれば幸いです):

class TestClass {
protected void toFrontTimer(JFrame frame) {
    try {
        bringToFrontTimer = new java.util.Timer();
        bringToFrontTask = new BringToFrontTask(frame);
        bringToFrontTimer.schedule( bringToFrontTask, 300, 300);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

class BringToFrontTask extends TimerTask {
    private Frame frame;
    public BringToFrontTask(Frame frame) {
        this.frame = frame;
    }
    public void run()
    {
        if(count < 2) {
            frame.toFront();
        } else {
            cancel();
        }
        count ++;
    }
    private int count = 0;
}

public void cleanup() {
    if(bringToFrontTask != null) {
        bringToFrontTask.cancel();
        bringToFrontTask = null;
    }
    if(bringToFrontTimer != null) {
        bringToFrontTimer = null;
    }
}

java.util.Timer bringToFrontTimer = null;
java.util.TimerTask bringToFrontTask = null;
}

私はアプレットに詳しくないので、これは暗闇の中でのショットですが、IE の組み込みの window.showModalDialog メソッドを見てみることができます。使い方はかなり簡単です。おそらくこれとノアの提案の組み合わせでしょうか?

JavaScript 統合を使用して、JavaScript からモーダルを起動してみるとよいでしょう (「 http://www.raditha.com/java/mayscript.php たとえば)。

必要な JavaScript は次のようなものになります。

function getPassword() {
  return prompt("Enter Password");
}

Java は次のようになります。

password = jso.call("getPassword", new String[0]);

残念ながら、それは見栄えの良いモーダルを手に入れるという希望をすべて諦めることを意味します。幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top