关闭JFrame时执行操作

时间:2011-04-23 12:58:46

标签: 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();
             }
         });
     }
 }

所以当我单击Detail Frame上的“Save”按钮时,我想在主框架中执行某些操作,而当在Detail Frame上单击“x”时,我不想做任何事情。

希望有人能帮助我,对不起我的英语..

3 个答案:

答案 0 :(得分:2)

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

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

编辑:更多想法:

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

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

将编辑结果存储在DetailFrame的其他公共变量中(或者将其称为DetailDialog)。只有在单击“保存”按钮时才会发生这种情况。这甚至可以允许没有布尔变量(取决于您正在编辑的值的类型)。

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();
            }
        });
    }
}

答案 1 :(得分:0)

在主框架中创建细节框架,并使用windowadapter类向其添加windowlistener。通过检查更改,处理这些更改,然后处置详细信息框来实现windowclosing事件。这都是在大型机中完成的。

细节框架应该在关闭设置上不执行任何操作,以防止在记录更改之前处理细节框架。

您可能希望检查详细信息框中的更改,作为返回包含感兴趣数据的类的方法。这样你的windowlistener就可以很小了。

答案 2 :(得分:0)

忘掉第二个JFrame。改为使用模态对话框。它会阻止输入直到被解雇。一旦被解雇,唯一要做的就是决定是否更新原始数据。 JOptionPane具有一些内置功能,可以轻松实现。如果用户按下Cancelesc键,showInputDialog()方法将返回null作为结果。

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

class EditInfo {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                final JFrame f = new JFrame("Uneditable");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel p = new JPanel(new BorderLayout(10,10));

                final JTextField tf = new JTextField("Hello World!", 20);
                tf.setEnabled(false);
                p.add(tf, BorderLayout.CENTER);

                JButton edit = new JButton("Edit");
                edit.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        String result = JOptionPane.showInputDialog(
                            f,
                            "Edit text",
                            tf.getText());
                        if (result!=null) {
                            tf.setText(result);
                        }
                    }
                } );
                p.add(edit, BorderLayout.EAST);

                p.setBorder(new EmptyBorder(10,10,10,10));

                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

如果需要在JOptionPane中同时修改多个字段,请使用JPanel将其全部包含在内,并将其置于showMessageDialog()调用中。检查基于整数的返回结果,以确定用户是否确定了更改。