2

私の質問は、ユーザーがブラウザタブを切り替えたときにJAppletからJDialogを非表示にする方法に非常に関連しているようです。しかし、それは実用的な解決策を提供しません。

JWS/JNLPを使用してデプロイされたアプレットを開発しました。「NEWGAME」ダイアログの表示から始まります。

private class NewGameDialog extends CustomDialog implements ActionListener {
    ...
    public NewGameDialog () {
       super(topContainer, "NEW GAME", modalityType);

       System.out.println(topContainer + " " + modalityType);
       //prints JApplet and DOCUMENT_MODAL
    ...

CustomDialogただ拡張しますJDialog

public class CustomDialog extends JDialog implements WindowListener {

    public CustomDialog(Container cont, String title, ModalityType modalityType) {
        super(windowForComponent(cont), title, modalityType);
    }

    public static Window windowForComponent(Component c) {
        if (c instanceof Window) return (Window) c;
        return SwingUtilities.windowForComponent(c);
    }

    ...

これはJDialog、GUIクラスから呼び出される方法です。

public void requestNewGame () {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            NewGameDialog dialog = new NewGameDialog();
            dialog.setVisible(true);
        }
    });
}

ここに画像の説明を入力してください

ダイアログでモダリティを使用する方法で説明されているさまざまなタイプのモダリティを使用しました。目標はJDialog、ユーザーがブラウザの別のタブに切り替えたときに非表示にすることです。しかし、どのオプションも機能していないようです。ダイアログはすべてのタブの上に浮かんでいます。

ユーザーが別のタブに移動したときにダイアログを非表示にし、ユーザーがアプレットのタブに戻ったときに再度表示するにはどうすればよいですか?

4

1 に答える 1

4

これは、タブが変更されたときに親コンポーネントが画面上の位置を変更するという前提で機能します。例えば

JDialog.getParent().getLocationOnScreen()

テストされ、動作することが確認されています:

  • FireFox 19.0
  • Chromeバージョン25.0.1364.97m

失敗する:

  • Internet Explorer 8.0.7601.17514

ブラウザタブへのアクセスを拒否したか、セキュリティ例外を引き起こし た以外のDialog.ModalityType値を使用する。MODELESS

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DialogApplet extends JApplet {

    @Override
    public void init() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                initGUI();
            }
        };
        SwingUtilities.invokeLater(r);
    }

    public void initGUI() {
        JButton b = new JButton("Show Dialog");
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                showDialog();
            }
        };
        b.addActionListener(listener);
        add(b);
    }

    private JDialog d;
    JTextArea output;
    int currentX = -1;
    Timer timer;

    public void showDialog() {
        if (d==null) {
            output = new JTextArea(5,20);
            Window w = SwingUtilities.windowForComponent(this);
            d = new JDialog(w, "Dialog", Dialog.ModalityType.MODELESS);
            //Dialog.ModalityType.TOOLKIT_MODAL);  //security
            //Dialog.ModalityType.DOCUMENT_MODAL);
            //Dialog.ModalityType.APPLICATION_MODAL);
            d.add(output, BorderLayout.CENTER);
            ActionListener al = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    StringBuilder sb = new StringBuilder();


                    sb.append("parent location: \t" +
                        d.getParent().getLocation() + "\n");
                    sb.append("parent location - screen: \t" +
                        d.getParent().getLocationOnScreen() + "\n");

                    System.out.print(sb.toString());

                    output.setText(sb.toString());
                    if (currentX>-1 && 
                        currentX!=d.getParent().getLocationOnScreen().getX() 
                        ) {
                        System.out.println( "Goodbye world!" );
                        d.setVisible(false);
                        timer.stop();
                    }
                }
            };
            timer = new Timer(1000, al);
            d.pack();
            d.setLocationRelativeTo(d.getParent());
        }
        currentX = (int)d.getParent().getLocationOnScreen().getX();
        timer.start();
        d.setVisible(true);
    }
}

Javaスクリプト

おそらく代わりに、これについてはJSに注目してください。秘訣は、HTMLウィンドウのフォーカス/ブラーイベントを検出することにあるようです。EGは、次の回答で詳しく説明されています。

tabVisible()明らかに、JS Detectsタブの変更時に、またはtabHidden()ダイアログで適切なアクションを実行するなど、アプレット内のメソッドを呼び出すようにします。

于 2013-03-03T07:15:03.910 に答える