【问题标题】:Button for closing a JDialog用于关闭 JDialog 的按钮
【发布时间】:2011-10-21 14:25:44
【问题描述】:

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

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

我非常惊讶我无法使用 Google 找到这个问题的答案。我希望一个经常遇到的问题会在很多编程网站上得到广泛的报道。很奇怪,它不是。

【问题讨论】:

  • 好吧,在今天之前我从未使用过 JDialog。我确实看过那个 javadoc 几十次(我需要看看它包含什么方法)。但我没有看到任何关于关闭它的信息。
  • @SoboLAN 两种方法:dispose() & setVisible(false)

标签: java swing jdialog


【解决方案1】:

ActionListeneractionPerformed() 方法中,您需要类似:

dialog.setVisible(false);

如果您想永久删除对话框(将其从内存中释放),那么您会调用:

dialog.dispose(); 

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

如果您将按钮添加为 JDialog 子类的一部分(即,如果您有 class MyDialog extends JDialog 并且您要在 MyDialog 中添加动作侦听器),您会想要:

MyDialog.this.setVisible(false);

【讨论】:

  • 我在创建 JDialog 时这样做了:dialog.SetDefaultCloseOperation (JDialog.DISPOSE_ON_CLOSE);。在 ActionListener 中,我调用了这 2 个方法: dialog.setVisible (false); dialog.dispatchEvent (new WindowEvent (dialog, WindowEvent.WINDOW_CLOSING);。JDialog 确实关闭了,但我这样做的方式是正确的?谢谢你的回答(出奇的快),顺便说一句。
  • @berry120 - 肯定是 JDialog,它的布局和组件使用这种方法会继续存在于内存中吗?我想你经常这样做会让自己陷入严重的混乱。
  • @RudiKershaw 会的,是的 - 显然,您是否处理它取决于您是在以后重用相同的对话框还是根据需要创建它们。
  • @berry120 +1 表示MyDialog.this,但我不确定该符号是如何工作的。我知道MyDialog 是对该类的静态调用,但它如何“知道”this 是包含Button 的引用?
【解决方案2】:

您可以让ActionListener 发送WindowEvent.WINDOW_CLOSING,如here 所示。

【讨论】:

  • +1,将事件分派到窗口允许执行任何 WindowListener 代码。对于它的价值,您还可以查看Closing an Application 中的ExitAction 类。该动作更通用一点,因为它可以与任何框架或对话框一起使用。
  • @camickr: ExitAction 看起来是确保所有出口都通过WindowListener 的好方法。
【解决方案3】:
import java.awt.event.*;
import javax.swing.*;

public class YourDialog extends JDialog implements ActionListener {

  JButton button;

  public YourDialog() {
     button = new JButton("Close");
     button.addActionListener(this);
     add(button);
     pack();
     setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
      dispose();
  }
}
  • 仅使用dispose() 方法关闭对话框,父框架未关闭。 JVM没有终止的原因。

【讨论】:

  • 我认为 dispose () 是最好的方法。谢谢你,我现在有我需要的一切。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    一个典型的类会包含必要的字段、保存和取消按钮。

    public class EnterpriseGUI extends 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);
    
        }  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多