如何使JButton事件修改JFrame(this)

时间:2011-01-19 14:37:56

标签: java swing inner-classes

我正在尝试使JButton click事件修改按钮所在的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调用,但无法找到其他解决方案。有任何想法吗?有没有办法将'this'或任何其他参数传递给动作侦听器方法?

感谢。

3 个答案:

答案 0 :(得分:2)

当然你可以:

ClassX.this.setTitle("Title1");

将完成这项工作(Jon Skeet同意我的意见。)

答案 1 :(得分:1)

ClassX.this.setTitle("Title2");

答案 2 :(得分:0)

为什么不实现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);
            }
           } );
    }
}