如何只为他的父母制作JDialog?

时间:2013-02-28 11:28:17

标签: java swing modal-dialog jdialog

让我们说,我们有几个JFrame窗口同时可见,并且每个窗口JDialog都会出现。当我们的窗口处于级联模式且对话框setAlwaysOnToptrue时,所有对话框都将在最后一个窗口中显示。

我只想将Dialog组件与其所有者关联起来,这样当你在Frames之间切换时,你只会在顶部获得一个对话框,并且在单击一个框架时不会丢失该对话框。

对话框有这样的构造函数:

setAlwaysOnTop(true);
setModal(false);

提前致谢!

4 个答案:

答案 0 :(得分:5)

How to make JDialog onTop only for his parent?
  • setParent in the constructor properly

  • 必须使用setModalityType f.e. ModalityType.DOCUMENT_MODAL ModalityType.APPLICATION_MODAL代替setModal

  • setModalintialized / is parent forJDialog

  • 的容器有效
  • 不要使用多个JFrame,而是使用JDialog,重新使用此容器进行其他操作

例如

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);
        }
    }
}

答案 1 :(得分:1)

JDialog JDialog(Dialog owner, boolean modal)构造函数中的APIsetModal(),这意味着您可以创建一个对话框并指定父容器和模态。在模态部分中,将其设置为true意味着此对话框将是模态的,并且在显示对话框时无法访问父窗口。

但同样,您可以使用{{1}}方法来完成相同的工作。

答案 2 :(得分:0)

只需将Model设置为true,然后设置Relativelocation(parent);,不要将setontop(true)用于JDialog。

然后如果你回来打开那个时候你每次都会得到对话。但是当你拖动父框架时,这将有所不同。

答案 3 :(得分: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();
    }
}