Как заставить событие JButton изменять JFrame (это) - PullRequest
2 голосов
/ 19 января 2011

Я пытаюсь сделать событие щелчка JButton изменяющим JFrame, кнопка включена. Проблема в том, что сам класс - это JFrame (расширяющий его), поэтому я не могу вызвать 'this' из внутреннего класса, который обрабатывает событие. Я нашел решение, которое работает, но я думаю, что оно может привести к другим проблемам, поэтому я пытаюсь найти другой путь. Код выглядит следующим образом:

public class ClassX extends JFrame {

...

     this.setTitle("Title1");  //works fine

     jButton1 = new JButton();
     jButton1.addActionListener(new java.awt.event.ActionListener() {    
          public void actionPerformed(java.awt.event.ActionEvent e) {

               //this.setTitle("Title1");  //calling 'this' won't work inside an inner class

               //Ugly Solution
               JButton btn = (JButton) e.getSource();     
               JFrame frme = (JFrame) btn.getParent().getParent().getParent().getParent();
               frme.setTitle("Title2");
          }
     });

...

}

Я пытаюсь избежать нескольких вызовов getParent, но не могу найти другое решение. Есть идеи? Возможно, есть способ передать «этот» или любой другой параметр методу прослушивателя действий?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Конечно, вы можете:

ClassX.this.setTitle("Title1");

Выполните работу (и Джон Скит согласится со мной).

1 голос
/ 19 января 2011
ClassX.this.setTitle("Title2");
0 голосов
/ 19 января 2011

Вместо того, чтобы иметь внутренний класс ActionListener, почему бы не реализовать интерфейс ActionListener?

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;


    public class ClassX extends JFrame implements ActionListener
    {

    JButton jButton1;

    public ClassX()
    {
        jButton1 = new JButton();
        jButton.addActionListener(this);
        this.add(jButton);
    }

    public void actionPerformed(ActionEvent e)
    {
    this.setTitle("Button Clicked!")
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
           public void run() {
            ClassX frame1 = new ClassX();
                frame1.setVisible(true);
            }
           } );
    }
}
...