4

いくつかのJFrameウィンドウが同時に表示され、各ウィンドウJDialogが表示されるとします。ウィンドウがカスケード モードでダイアログ用の場合、すべてのダイアログが最後のウィンドウの上に表示されますsetAlwaysOnToptrue

Dialog コンポーネントをその所有者に関連付けたいだけなので、フレームを切り替えるときに、上部にダイアログが 1 つだけ表示され、フレームをクリックしてもこのダイアログが失われません。

ダイアログには次のようなコンストラクタがあります。

setAlwaysOnTop(true);
setModal(false);

前もって感謝します!

4

4 に答える 4

6
How to make JDialog onTop only for his parent?
  • コンストラクタでsetParentを適切に

  • 代わりにsetModalityTypefeを使用する必要が ありますModalityType.DOCUMENT_MODAL ModalityType.APPLICATION_MODALsetModal

  • setModalコンテナに有効です which intialized/ is parent forthisJDialog

  • 複数の を使用しないでくださいJFrameJDialog代わりに使用してください。このコンテナを別のアクションに再利用してください

例えば

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

public class SuperConstructor extends JFrame {

    private static final long serialVersionUID = 1L;

    public SuperConstructor() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setTitle("Super constructor");
        Container cp = getContentPane();
        JButton b = new JButton("Show dialog");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                FirstDialog firstDialog = new FirstDialog(SuperConstructor.this);
            }
        });
        cp.add(b, BorderLayout.SOUTH);
        JButton bClose = new JButton("Close");
        bClose.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                System.exit(0);
            }
        });
        add(bClose, BorderLayout.NORTH);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SuperConstructor superConstructor = new SuperConstructor();
            }
        });
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent) {
            super(parent, "FirstDialog");
            setPreferredSize(new Dimension(200, 200));
            setLocationRelativeTo(parent);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
            JButton bNext = new JButton("Show next dialog");
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    SecondDialog secondDialog = new SecondDialog(parent, false);
                }
            });
            add(bNext, BorderLayout.NORTH);
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
    private int i;

    private class SecondDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        SecondDialog(final Frame parent, boolean modal) {
            //super(parent); // Makes this dialog unfocusable as long as FirstDialog is visible
            setPreferredSize(new Dimension(200, 200));
            setLocation(300, 50);
            setModal(modal);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setTitle("SecondDialog " + (i++));
            setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
}
于 2013-02-28T12:02:12.397 に答える
1

APIJDialogのコンストラクターの1 つはJDialog(Dialog owner, boolean modal)、ダイアログを作成し、親コンテナーとモダリティを指定できることを意味します。モーダル セクションで true に設定すると、このダイアログがモーダルになり、ダイアログが表示されている間は親ウィンドウにアクセスできなくなります。

ただし、このsetModal()方法を使用して同じことを行うことができます。

于 2013-02-28T13:22:56.837 に答える
0

この仕事をするフォーカスリスナーを構築することで、この問題を解決することができました。次に、このリスナーをウィンドウに設定して、 が閉じられるまでダイアログを常に表示しておくことができます。これが私のために働いたものです:

public class WindowFocusListenerDialogFocus implements WindowFocusListener {
    private JFrame _dialogFrame;


    public WindowFocusListenerDialogFocus(JFrame dialogFrame) {
        _dialogFrame = dialogFrame;
    }


    @Override
    public void windowLostFocus(WindowEvent e) {
        System.out.println("Focus lost!");
    }


    @Override
    public void windowGainedFocus(WindowEvent e) {
        System.out.println("Focus gained!");
        _dialogFrame.toFront();
    }
}
于 2014-12-24T13:02:52.657 に答える
0

Modeltrue を設定するだけで、JDialog に設定Relativelocation(parent);して使用しないでください。setontop(true)

そして、その時間を再び開くと、毎回ダイアログが表示されます。ただし、親フレームをドラッグすると異なります。

于 2014-07-31T13:21:08.277 に答える