gpt4 book ai didi

java - 如何防止关闭JFrame时在JFrame前面弹出JDialog?

转载 作者:行者123 更新时间:2023-12-01 22:31:10 27 4
gpt4 key购买 nike

代码说明:

我有一个名为GUI,它扩展了JFrame并且有一个boolean变量closable中。我向 JFrame 添加了 WindowListener,并向 JFrame 添加了 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);。这会阻止 JFrame 关闭。一切都按预期进行。

我在另一个中从main执行GUI prog=new GUI()并使用显示JFrame prog.setVisible(true);。我还创建了一个名为 dJDialog 并将其显示在 JFrame 后面。当d关闭时,JFrame也可以关闭。

问题:

我的代码有效。唯一的问题是,当我按下 JFrame 标题栏中的 X(关闭按钮)而不关闭其后面的 JDialog 时,然后当第一个 JOptionPane() 执行时,JDialog 会在 JFrame 前面弹出。

代码:

主类:

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
import javax.swing.JOptionPane;
import javax.swing.JDialog;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; //All these are used in my full program

public class ThirdProgram {
public static void main(String[] args)
{
final GUI prog=new GUI("My ThirdProgram in Java"); //Creating the JFrame
prog.setBounds(350,325,610,175);
prog.setResizable(false);

JDialog d=new JDialog(); //The problematic JDialog
d.setBounds(400,400,500,70);
d.add(new JLabel("I'm trying hard to stop you from closing the JFrame in front of you"));
d.setTitle("Unidentified JDialog");
d.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
d.setLayout(new FlowLayout(FlowLayout.CENTER));

d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
prog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //JFrame is now closable
prog.closable=false;
}
});

d.setVisible(true);
prog.setVisible(true);
}
}

扩展JFrame的:

class GUI extends JFrame implements ActionListener {

//some code here

boolean closable=true;

public GUI(String header)
{
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
if(closable) /*The problem occurs when the below JOptionPane() executes*/
JOptionPane.showMessageDialog(null,"You can't close this that easily! So try this program!","No way!",JOptionPane.ERROR_MESSAGE);
else
JOptionPane.showMessageDialog(null,"Eh...Where has the Guy preventing you from closing this gone?!?","Security Bypassed!",JOptionPane.ERROR_MESSAGE);
}});

/*Lots of code after this*/

问题:

当我关闭JDialog时,如何防止它在JFrame前面弹出?

最佳答案

通常,当您创建 JDialog 时,您会指定 JFrame 作为所有者。这样,当您单击任务栏上的框架图标时,所有子对话框都可以通过 JFrame 显示,否则无法激活该对话框,除非您最小化桌面上的所有其他 Activity 窗口。

如果您确实想要一个独立的 JDialog,那么您需要将您的对话框指定为另一个框架的子级:

//JDialog d=new JDialog(); //The problematic JDialog
JDialog d=new JDialog(new JFrame()); //The problematic JDialog

关于java - 如何防止关闭JFrame时在JFrame前面弹出JDialog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27721989/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com