java - 关闭 JFrame 时执行操作

标签 java dispose jframe

在我的程序中,我有一个包含按钮的主 JFrame。单击此按钮时,会出现一个新的 JFrame,我可以在其中更改一些信息。每当我完成编辑时,我都会按新 JFrame 上的保存按钮,该按钮将保存更改并处置 JFrame。现在,完成此操作后,我还想在主 JFrame 中执行一个操作,但前提是某些内容发生了变化。如果我打开新的 JFrame 并在不使用保存按钮的情况下再次关闭它,我不想在主框架中执行任何操作。 我尝试在网上搜索解决方案,但似乎没有任何有用的东西..

到目前为止我得到的代码示例: 主框架...


public class MainFrame extends JFrame
 {
     public MainFrame()
     {
         super("Main Frame");
         JButton details = new JButton("Add Detail");
         add(details);
         details.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e)
             {
                 new DetailFrame().setVisible(true);
             }
         });
     }
 }

细节框架...


 public class DetailFrame extends JFrame
 {
     public DetailFrame()
     {
         super("Detail Frame");
         JButton save = new JButton("Save");
         add(save);
         save.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e)
             {
                 // Save whatever content
                 dispose();
             }
         });
     }
 }

因此,当我单击详细框架上的“保存”按钮时,我想在主框架中执行某些操作,而当单击详细框架上的“x”时,我不想执行任何操作。

希望有人能够帮助我,抱歉我的英语......

最佳答案

您可以将 MainFrame 句柄传递给 DetailFrame 构造函数。然后,单击“保存”按钮时,DetailFrame 将调用 MainFrame 中的函数并将更改传递给它。

另一种方法是在 DetailFrame 中创建一个 public boolean 变量,并在单击“保存”按钮时将其设置为 true。这样 MainFrame 将知道 DetailFrame 是否已关闭或已保存。

编辑:更多想法:

使用JDialog而不是JFrameJDialog.setVisible 是模态的,即它将阻塞调用函数,直到对话框关闭;这样您就可以在同一个“详细信息”按钮监听器中处理对话框的结果。

要在调用对话框后访问该对话框,请将对话框存储在单独的变量中。首先构造对话框,然后显示它,然后通过分析其变量来处理结果。

将编辑结果存储在 DetailFrame 的其他公共(public)变量中(或者我们称之为 DetailDialog)。仅当单击“保存”按钮时才会发生这种情况。这甚至可以允许不使用 boolean 变量(取决于您正在编辑的值的类型)。

DetailDialog dlg = new DetailDialog();
dlg.setVisible(true);
if(dlg.approvedResult != null) {
    // process the result...
}

编辑: 抱歉,JDialog 默认情况下不是模态的。需要调用特殊的 super 构造函数使其成为模态。

此外,在这里您必须将对 MainFrame 的引用传递给对话框构造函数,但您仍然可以将其声明为简单的 JFrame 并避免不必要的依赖项。

要从匿名 ActionListener 中获取对封闭 MainFrame 的引用,请使用 MainFrame.this

为了能够在创建按钮后更改按钮文本,您必须将按钮存储在成员变量中。

主框架...

public class MainFrame extends JFrame
{
    private JButton details = new JButton("Add Detail");

    public MainFrame()
    {
        super("Main Frame");
        getContentPane().add(details);
        details.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                DetailDialog dlg = new DetailDialog(MainFrame.this);
                dlg.setVisible(true);
                if(dlg.approved){
                    details.setText("Edit Detail");
                }
            }
        });
    }
}

详细信息对话框...(不是框架)

public class DetailDialog extends JDialog
{
    public boolean approved = false;

    public DetailDialog(JFrame parent)
    {
        super(parent,"Detail Dialog",true);        // modal dialog parented to the calling frame
        JButton save = new JButton("Save");
        getContentPane().add(save);
        save.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                // Save whatever content
                approved = true;
                dispose();
            }
        });
    }
}

关于java - 关闭 JFrame 时执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764292/

相关文章:

java - 是否有任何众所周知的快速持久缓存解决方案?

java 运行时进程 - 检查是否等待输入

c# - MemoryStream、XmlTextWriter 和警告 4 CA2202 : Microsoft. 用法

c# - 为什么推荐的 dispose 模式会在层次结构的每个级别添加一个已处理字段?

java - 如何将 JPanel 添加到 JFrame 的中心?

java - 在 JPanel 内滚动 JFrame

java - 我的项目运行,但有几个错误,例如我需要删除的行

java - JScrollPane 中具有固定大小的 JTree

java - StyleConstants.setBold 中 boolean 参数的含义是什么?

c# - Rfc2898DeriveBytes 的版本无关代码(在 .NET 4.0 上有 Dispose 但在 2.0 上没有)