我们是否需要使用中间方法在ActionListener中"dispose()"?

Yas*_*jaj 2 java swing dispose jdialog actionlistener

我在SO上找到了这个答案,并对此感到困惑.

我们有一个问题,想知道如何在ActionListener中处理JDialog.

try this way:

exit.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        exitActionPerformed(evt);
    }
});
and then

 private void exitActionPerformed(java.awt.event.ActionEvent evt) {
        this.dispose();
    }
Run Code Online (Sandbox Code Playgroud)

这是回答者发布的代码(这里是问题的链接)

这是我在自己的代码中所做的事情:

buttonCancel.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            dispose();
        }
    });
Run Code Online (Sandbox Code Playgroud)

但我真的很关心上面的答案.我做错了什么或不改变任何事情,如果这样做?如果它没有影响,你会知道为什么这个人使用中间方法回答了吗?

谢谢

Cha*_*uni 5

我假设你在MyDialog class中包含哪个extends JDialog

请考虑以下代码.

    exit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            exitActionPerformed(evt);
        }
    });
Run Code Online (Sandbox Code Playgroud)

您已经创建了一个匿名内部类java.awt.event.ActionListener.如果你this在匿名内部类中使用关键字,它允许自己访问它,但不是 MyDialog class你想象的那样.因此,this.dispose()方法不可用.但你可以像访问它一样访问它MyDialog.this.dispose();

看看你的第二个例子

    buttonCancel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            dispose();
        }
    });
Run Code Online (Sandbox Code Playgroud)

当然,ActionListener这里也是一个匿名的内部类.但是它允许访问它包含类的方法.所以,这里可以使用dispose()方法.