繁体   English   中英

关闭JFrame时执行操作

[英]Performing action when closing 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”时,我不想做任何事情。

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

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

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

编辑:一些更多的想法:

使用JDialog而不是JFrame JDialog.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();
            }
        });
    }
}

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

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

您可能希望实现检查详细信息框中的更改,作为返回保存有趣数据的类的方法。 这样你的windowlistener可以很小到一点。

忘掉第二个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() ,并将它们放在showMessageDialog()调用中。 检查基于整数的返回结果,以确定用户是否确定了更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM