这在jdialog中按钮的动作监听器方法中引用了什么?

时间:2011-12-11 10:37:45

标签: java swing this jdialog

在我的对话框中,我有一个按钮。在它的动作侦听器方法中,这是指什么?它是按钮的参考还是JDialog的参考?我注意到它是JDialog的引用,因为在我的IDE中我按 this。所有其他组件和容器的方法如dispose出现。如果是这样,它是如何引用JDialog的?它应该是JButton。

jButton5.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton5ActionPerformed(evt);
        }
    });

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    boolean rB_1 = jRadioButton1.isSelected();
    boolean rB_2 = jRadioButton2.isSelected(); 
    boolean rB_4 = jRadioButton4.isSelected();

    if(rB_2) 
        new class_design().changeStatusOfMessageDisplayMode(true);

    this.dispose(); // <-------- this one   
}

done

点击名为jdialog的按钮时,会调用上面的代码

4 个答案:

答案 0 :(得分:3)

这看起来像Netbeans的代码。 jButton5ActionPerformed作为JDialog中的一个方法站在它自己身上。这显然是指包含该方法的JDialog类。

    jButton1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            this <---Refers to the ActionListener.
        }
    });
    this <---Refers to the class (JDialog in your case)

为了避免陷入这种情况,Netbeans在匿名ActionListener之外创建一个新方法jButton1ActionPerformed,并调用它。

    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    this <---obviously refers to the JDialog
}

答案 1 :(得分:3)

它是对实现ActionListener接口的类的对象的引用{/ 1}}。

如果为此实现了“独立”类,它将是该类的实例。如果你传入了一个匿名类,那么它就是对该匿名类的实例的引用。

如果动作侦听器是JDialog本身,则addActionListener引用JDialog对象。

在您的情况下,您使用的是匿名类。所以在this内,actionPerformed指的是该类的一个实例。 但是,请注意您正在调用未在该匿名类中定义的函数。这就是“神奇”发生的地方:内部类具有对封闭类的引用。

this

相当于:

jButton5ActionPerformed(evt);

因此在myenclosingobject.jButton5ActionPerformed(evt); 内,jButton5ActionPerformed指的是封闭类的对象,即创建该匿名类实例的对象。

这在JLS Inner classes and Enclosing instances中解释:

  

类O的直接内部类C的实例i与O的实例相关联,称为i的直接封闭实例。在创建对象时确定对象的直接封闭实例(如果有)(第15.9.2节)。

答案 2 :(得分:1)

1)你必须阅读How to Make Dialogs

2)如果您每个应用生命周期只创建JDialog一次,则调用JDialog#dispose(),否则只创建一次JDialog并将其重新用于其他操作/事件

答案 3 :(得分:1)

在你的情况下,我想这是一个场景,

  

可能在netbeans中,你创建了一个jframe,然后添加了一个jdialog.Then添加了一个jbutton,现在双击按钮,编写执行动作的代码(或右键单击,事件&gt;动作&gt; actionperformed)

注意:然后添加了一个jdialog ,我的意思是你拖动它将它放到框架中。

在给定方案中,指的是jframe,而不是jdialog