Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于关闭JDialog的按钮_Java_Swing_Jdialog - Fatal编程技术网

Java 用于关闭JDialog的按钮

Java 用于关闭JDialog的按钮,java,swing,jdialog,Java,Swing,Jdialog,我想在JDialog的底部添加一个按钮(JButton),按下该按钮时会关闭JDialog。问题是我不知道在那个按钮的ActionListener中写什么。我不希望按钮退出程序,只需关闭对话框 JDialog是通过显式调用JDialog的一个构造函数创建的,而不是通过调用JOptionPane中的一个方法创建的 我非常惊讶,我无法用谷歌找到答案。我期望一个经常遇到的问题会在很多编程网站上被广泛覆盖。这很奇怪。在ActionListener的actionPerformed()方法中,您将需要类似以

我想在JDialog的底部添加一个按钮(JButton),按下该按钮时会关闭JDialog。问题是我不知道在那个按钮的ActionListener中写什么。我不希望按钮退出程序,只需关闭对话框

JDialog是通过显式调用JDialog的一个构造函数创建的,而不是通过调用JOptionPane中的一个方法创建的


我非常惊讶,我无法用谷歌找到答案。我期望一个经常遇到的问题会在很多编程网站上被广泛覆盖。这很奇怪。

ActionListener
actionPerformed()
方法中,您将需要类似以下内容:

dialog.setVisible(false);
如果要永久删除该对话框(将其从内存中释放),还可以调用:

…其中dialog是对话框的名称。如果
dialog
是一个局部变量,那么您需要将其设置为final,以便以这种方式访问它(或者从Java8开始确保它是“有效的final”)

如果您将按钮添加为JDialog子类的一部分(即,如果您拥有
类MyDialog扩展JDialog
,并且在
MyDialog
中添加操作侦听器),您将需要:

MyDialog.this.setVisible(false);

您可以让
ActionListener
发送
WindowEvent.WINDOW\u关闭
,如图所示

  • 使用
    dispose()
    method父帧未关闭,仅关闭diallolg。JVM未终止的原因


除其他答案外,您还可以将其设置为对话框根窗格的默认按钮:

JButton myButton = new JButton("Close");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        dispose(); // Or whatever else
        setVisible(false);
    }
});
getRootPane().setDefaultButton(myButton);

这样,每当按下Enter键时,就会调用它的
ActionListener

我的做法略有不同,它就是为了达到这个目的。我有几节课。它们扩展了JPanel,服务于不同的目的,并使用JDialogs获取用户的输入

典型的类将包含必要的字段、保存和取消按钮

公共类EnterpriseGUI扩展javax.swing.JPanel{…}如下所示:

类EnterpriseGUI有一个私有变量jdialog和一个设置jdialog的方法。还有“保存”按钮和“取消”按钮的ActionEvent

private JDialog jdialog;
public void setJDialog(JDialog jdialog) {
    this.jdialog = jdialog;
}
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // Do your stuff..
    jdialog.dispose();
} 
private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // Discard your stuff..
    jdialog.dispose();
} 
最后,我根据需要从任何其他类创建EnterpriseGUI实例,并将其嵌入JDialog

Class OtherClass{
private JDialog dialog;
private EnterpriseGUI = new enterprisegui();
    private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
        this.dialog = new JDialog(this, "My dialog", true);
        this.dialog.setResizable(false);
        enterprisegui.setJDialog(dialog);
        this.dialog.getContentPane().add(enterprisegui);
        this.dialog.pack();

        Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();
        this.dialog.setLocation(new Double((Size.getWidth()/2) - 
                (dialog.getWidth()/2)).intValue(), new Double((Size.getHeight()/2) - 
                        (dialog.getHeight()/2)).intValue());
        this.dialog.setVisible(true);

    }  
}

我是在创建JDialog:dialog.SetDefaultCloseOperation(JDialog.DISPOSE\u ON\u CLOSE)时这样做的;。在ActionListener中,我调用了以下两个方法:dialog.setVisible(false);dialog.dispatchEvent(新的WindowEvent(dialog,WindowEvent.WINDOW_CLOSING);。JDialog确实会关闭,但我的方式是正确的?感谢您(速度惊人地快)回答,顺便说一句。@berry120-使用这种方法,JDialog的布局和组件肯定会继续存在于内存中吗?我想你可能会经常这样做,把自己弄得一团糟。@RudiKershaw会的,是的-显然,你是否处理它取决于你是在以后重用同一个对话框,还是在需要时创建它们d它们。@berry120+1表示
MyDialog。这是
,但我不确定该符号是如何工作的。我知道
MyDialog
是对类的静态调用,但它如何“知道”那
这个
是包含
按钮的引用
?好吧,在今天之前我从未使用过JDialog。我确实看了那个javadoc几十次(我需要看看它包含哪些方法)。但是我没有看到任何关于关闭它的内容。@SoboLAN有两个方法:
dispose()
setVisible(false)
+1,将事件分派到窗口允许执行任何WindowListener代码。您还可以查看中的
ExitAction
类。该操作更一般,因为它可以用于任何帧或对话框。@camickr:
ExitAction
看起来是确保所有退出的好方法通过
WindowListener
。我认为dispose()是最好的方法。谢谢,我现在已经有了我需要的一切。
private JDialog jdialog;
public void setJDialog(JDialog jdialog) {
    this.jdialog = jdialog;
}
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // Do your stuff..
    jdialog.dispose();
} 
private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // Discard your stuff..
    jdialog.dispose();
} 
Class OtherClass{
private JDialog dialog;
private EnterpriseGUI = new enterprisegui();
    private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
        this.dialog = new JDialog(this, "My dialog", true);
        this.dialog.setResizable(false);
        enterprisegui.setJDialog(dialog);
        this.dialog.getContentPane().add(enterprisegui);
        this.dialog.pack();

        Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();
        this.dialog.setLocation(new Double((Size.getWidth()/2) - 
                (dialog.getWidth()/2)).intValue(), new Double((Size.getHeight()/2) - 
                        (dialog.getHeight()/2)).intValue());
        this.dialog.setVisible(true);

    }  
}