Java 用于关闭JDialog的按钮
我想在JDialog的底部添加一个按钮(JButton),按下该按钮时会关闭JDialog。问题是我不知道在那个按钮的ActionListener中写什么。我不希望按钮退出程序,只需关闭对话框 JDialog是通过显式调用JDialog的一个构造函数创建的,而不是通过调用JOptionPane中的一个方法创建的Java 用于关闭JDialog的按钮,java,swing,jdialog,Java,Swing,Jdialog,我想在JDialog的底部添加一个按钮(JButton),按下该按钮时会关闭JDialog。问题是我不知道在那个按钮的ActionListener中写什么。我不希望按钮退出程序,只需关闭对话框 JDialog是通过显式调用JDialog的一个构造函数创建的,而不是通过调用JOptionPane中的一个方法创建的 我非常惊讶,我无法用谷歌找到答案。我期望一个经常遇到的问题会在很多编程网站上被广泛覆盖。这很奇怪。在ActionListener的actionPerformed()方法中,您将需要类似以
我非常惊讶,我无法用谷歌找到答案。我期望一个经常遇到的问题会在很多编程网站上被广泛覆盖。这很奇怪。在
ActionListener
的actionPerformed()
方法中,您将需要类似以下内容:
dialog.setVisible(false);
如果要永久删除该对话框(将其从内存中释放),还可以调用:
…其中dialog是对话框的名称。如果dialog
是一个局部变量,那么您需要将其设置为final,以便以这种方式访问它(或者从Java8开始确保它是“有效的final”)
如果您将按钮添加为JDialog子类的一部分(即,如果您拥有类MyDialog扩展JDialog
,并且在MyDialog
中添加操作侦听器),您将需要:
MyDialog.this.setVisible(false);
您可以让
ActionListener
发送WindowEvent.WINDOW\u关闭
,如图所示
- 使用
method父帧未关闭,仅关闭diallolg。JVM未终止的原因dispose()
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);
}
}