Java JDialog弹出在所有窗口的顶部

Java JDialog弹出在所有窗口的顶部,java,swing,jdialog,Java,Swing,Jdialog,我正在创建一个JDialog作为信息弹出窗口,在满足某些条件时出现在我的主窗口(JFrame)顶部。但是当我在应用程序顶部的另一个窗口中工作时,会出现JDialog弹出窗口,它会在另一个应用程序的顶部弹出。我希望JDialog弹出窗口出现在我的应用程序窗口的顶部,但不是所有应用程序的顶部 我该怎么做 现状: _____________ ____________________________ ____________ | mainframe | -> | other ap

我正在创建一个
JDialog
作为信息弹出窗口,在满足某些条件时出现在我的主窗口(
JFrame
)顶部。但是当我在应用程序顶部的另一个窗口中工作时,会出现
JDialog
弹出窗口,它会在另一个应用程序的顶部弹出。我希望
JDialog
弹出窗口出现在我的应用程序窗口的顶部,但不是所有应用程序的顶部

我该怎么做

现状:

_____________     ____________________________     ____________
| mainframe |  -> | other application window*|  -> | my popup |
-------------      ---------------------------      -----------
_____________     _____________      __________________________
| mainframe |  -> | my popup  |  -> | other application window*|  
-------------      ------------     ----------------------------      
期望值:

_____________     ____________________________     ____________
| mainframe |  -> | other application window*|  -> | my popup |
-------------      ---------------------------      -----------
_____________     _____________      __________________________
| mainframe |  -> | my popup  |  -> | other application window*|  
-------------      ------------     ----------------------------      
*任意其他应用程序,如Word、Outlook、Counter Strike等:)

使用的代码:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class DialogSSCCE extends JFrame {

    private static final long   serialVersionUID    = 1L;
    private JPanel  contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    DialogSSCCE frame = new DialogSSCCE();
                    frame.setAutoRequestFocus(false);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public DialogSSCCE() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JButton btnTest = new JButton("test");
        btnTest.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                javax.swing.Timer timerDialog = new javax.swing.Timer(3000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JDialog dia =  new JDialog(DialogSSCCE.this);
                        dia.setUndecorated(true);
                        dia.setModal(false);
                        dia.setBounds(100, 100, 200, 200);
                        dia.setAutoRequestFocus(false);
                        dia.setAlwaysOnTop(false);
                        dia.setUndecorated(true);
                        dia.setVisible(true);
                    }
                });
                timerDialog.setRepeats(true);
                timerDialog.start();
            }
        });
        contentPane.add(btnTest, BorderLayout.CENTER);
    }

}
解决方案:
我用其父框架初始化了JDialog,但是父框架还没有准备好,所以对话框是用
null
初始化的。这就解释了为什么对话框的行为独立于主框架

调用
setAutoRequestFocus(false)
来调用
JDialog


编辑-附加信息+rant:当我们在打字时,一些后台程序或我们的操作系统决定向我们的脸上扔一个窗口,抢夺我们的键盘输入,甚至可能点击我们甚至没有机会看到的东西时,我们都讨厌它。我认为不关注弹出窗口应该是默认行为。如上所述,如果除上述方法调用外,您还调用了
setAlwaysonTop(true)
或覆盖其
setVisible
方法,使其在屏幕上向前移动而不聚焦,则它将出现在其他应用程序前面,但不会获得聚焦。这样你就可以在不影响你一天的情况下收到通知。我建议这样做,以防您只对焦点窃取而不是实际显示的对话框感到恼火。

我意外地用null而不是其所有者将
JFrame
初始化为
JDialog
,因为在创建
JDialog

Yo dawg时,主框架还没有初始化好,所以我听说你喜欢对话框,所以我在你的对话框上放了一个对话框,这样它可以在弹出时弹出!你能试着把你的问题弄清楚一点吗。我不知道你想要达到什么,等等。。所以你正在使用多个JFrame,碰巧你有多个JDialog或者什么?不,正如上面所写的:一个大型机(JFrame)+一个弹出窗口(JDialog)->弹出窗口应该在大型机的顶部,但它不是,而是显示在所有应用程序的所有窗口的顶部。我添加了一个图形…展示了问题的帖子。