在我的程序中,我有一个包含按钮的主 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
而不是JFrame
。 JDialog.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/