昨天我在这里问了一个关于这个主题的非常模糊的问题(我投票决定现在就结束这个问题),之后我就能够找出问题并创建一个mcve来显示这种行为。
场景如下所示:
当一些操作在后台进行时,前台提供了一个模式的“等待”对话框,同时jframe也被设置为禁用,这只是为了确保。后台任务完成后,将再次启用框架并释放对话框。
问题是,在启用jframe并释放模式对话框之后,jframe会突然移到后台。有了“背景”的意思,它是移动到在jframe之前有焦点的窗口后面。为什么会这样?
此代码应复制问题:
private static JFrame frame;
private static JDialog dialog;
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
buildFrame();
buildDialog();
}
});
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
}
protected static void buildDialog() {
dialog = new JDialog(frame);
dialog.getContentPane().add(new JLabel("This is the dialog"));
dialog.setLocationRelativeTo(frame);
javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
frame.setEnabled(true);
}
});
t.setRepeats(false);
t.start();
dialog.pack();
dialog.setVisible(true);
}
protected static void buildFrame() {
frame = new JFrame();
frame.setMinimumSize(new Dimension(400, 400));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JLabel("This is the Frame"));
frame.setEnabled(false);
frame.pack();
frame.setVisible(true);
}
有人知道为什么会发生这种情况以及如何防止这种情况吗?
1条答案
按热度按时间fnx2tebb1#
问题在于方法
frame.setEnabled()
. 我不知道为什么,但它隐藏了框架。我的建议是删除它并使用情态概念:dialog.setModal(true)
(当显示对话框时,也会使父帧不可用。若要使框架不可用,可以在其上放置玻璃窗格。代码如下: