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)->弹出窗口应该在大型机的顶部,但它不是,而是显示在所有应用程序的所有窗口的顶部。我添加了一个图形…展示了问题的帖子。