что это означает в методе прослушивания действия кнопки в jdialog? - PullRequest
0 голосов
/ 11 декабря 2011

В моем диалоговом окне у меня есть кнопка. В каком методе слушателя действия это относится? Это ссылка на кнопку или ссылка на 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 ]

3 голосов
/ 11 декабря 2011

Это ссылка на объект класса, который реализует интерфейс ActionListener для вас addActionListener.

Если вы реализовали для этого «автономный» класс, он будет экземпляром этого класса. Если вы передали анонимный класс, то это ссылка на экземпляр этого анонимного класса.

Если слушателем действия является сам JDialog, то this ссылается на объект JDialog.

В вашем случае вы используете анонимный класс. Так внутри actionPerformed, this относится к экземпляру этого класса. Но , обратите внимание, что вы вызываете функцию, которая не определена в этом анонимном классе. Вот где происходит «волшебство»: внутренние классы имеют ссылку на класс-оболочку.

jButton5ActionPerformed(evt);

эквивалентно:

myenclosingobject.jButton5ActionPerformed(evt);

То есть внутри jButton5ActionPerformed, this относится к объекту включающего класса, который создал этот экземпляр анонимного класса.

Это объясняется в JLS Внутренние классы и включающие экземпляры :

Экземпляр i прямого внутреннего класса C класса O связан с экземпляром O, известным как непосредственно включающий экземпляр i. Непосредственно включающий экземпляр объекта, если таковой имеется, определяется при создании объекта (§15.9.2).

3 голосов
/ 11 декабря 2011

Это похоже на код из 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 создает новый метод jButton1ActionPerformed вне анонимного ActionListener и вызывает его.

    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 голос
/ 11 декабря 2011

В вашем случае, я полагаю, это сценарий,

Возможно, в netbeans вы создали jframe, затем добавили jdialog. Затем добавили кнопку j, теперь дважды щелкнули кнопку, чтобы написать код для выполненного действия (или щелчок правой кнопкой мыши по событиям> action> actionperformed)

Примечание: затем добавил jdialog , я имел в виду, что вы перетащили его и бросили в кадр.

В данном сценарии это относится к jframe, а не к jdialog

1 голос
/ 11 декабря 2011

1) Вы должны прочитать Как делать диалоги

2) если вы создаете JDialog только один раз для жизненного цикла приложений, тогда вызывайте JDialog # dispose () , в противном случае создайте JDialog только один раз и используйте его для других действий / событий

...