在我的程序中,我有一个包含按钮的主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”时,我不想做任何事情。
希望有人能帮助我,对不起我的英语..
答案 0 :(得分:2)
您可以将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();
}
});
}
}
答案 1 :(得分:0)
在主框架中创建细节框架,并使用windowadapter类向其添加windowlistener。通过检查更改,处理这些更改,然后处置详细信息框来实现windowclosing事件。这都是在大型机中完成的。
细节框架应该在关闭设置上不执行任何操作,以防止在记录更改之前处理细节框架。
您可能希望检查详细信息框中的更改,作为返回包含感兴趣数据的类的方法。这样你的windowlistener就可以很小了。
答案 2 :(得分:0)
忘掉第二个JFrame
。改为使用模态对话框。它会阻止输入直到被解雇。一旦被解雇,唯一要做的就是决定是否更新原始数据。 JOptionPane
具有一些内置功能,可以轻松实现。如果用户按下Cancel
或esc
键,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()
调用中。检查基于整数的返回结果,以确定用户是否确定了更改。