4

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

我只想将 Dialog 组件与其所有者相关联,这样当您在 Frames 之间切换时,您只会在顶部看到一个对话框,并且在单击框架时不会丢失此对话框。

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

setAlwaysOnTop(true);
setModal(false);

提前致谢!

4

4 回答 4

6
How to make JDialog onTop only for his parent?
  • setParent 在构造函数中正确

  • 必须使用 setModalityTypefeModalityType.DOCUMENT_MODAL ModalityType.APPLICATION_MODAL而不是setModal

  • setModalintialized对/ is parent forthis的容器有效JDialog

  • 不要使用多个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中,构造函数之一JDialog(Dialog owner, boolean modal)意味着您可以创建一个对话框并指定父容器以及模态。在 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 和 Just 设置Relativelocation(parent);,不要setontop(true)用于 JDialog。

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

于 2014-07-31T13:21:08.277 回答