JDialog弹出所有窗口

时间:2014-03-28 13:57:45

标签: java swing jdialog

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

我该怎么做?

现状:

_____________     ____________________________     ____________
| 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初始化了对话框。这解释了为什么对话框独立于主框架的行为

2 个答案:

答案 0 :(得分:1)

setAutoRequestFocus(false)致电JDialog

编辑 - 附加信息+咆哮:我们都讨厌在打字和一些后台程序或我们的操作系统决定在我们的脸上抛出一个窗口,抓住我们的键盘输入,甚至可能点击我们甚至没有机会看到的东西。我认为不关注弹出窗口应该是默认行为。有了这个说法,如果除了上面的方法之外,你打电话给setAlwaysonTop(true)或覆盖它的setVisible方法,这样你就可以在屏幕上显示它而不给它关注,它会出现在其他应用程序之前,但没有获得焦点。通过这种方式,您可以在不破坏一天的情况下收到通知。我建议只是因为你只是通过焦点窃取而不是实际显示的对话框而烦恼。

答案 1 :(得分:0)

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

时主框架尚未准备好初始化