import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FileChooseTest {
  public static void main(String[] args){
  JFrame frame=new JFrame();
  final JTextField textfield=new JTextField();
  JButton button= new JButton("Choose File");
  button.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
  frame.setTitle("testing");
  }
  });
  frame.setLayout(new BorderLayout());
  frame.getContentPane().add(button,BorderLayout.NORTH);
  frame.getContentPane().add(textfield,BorderLayout.SOUTH);
  frame.addWindowListener(new WindowAdapter(){
  public void windowClosing (WindowEvent e){
  System.exit(0);
  }
  });
  frame.pack();
  frame.setVisible(true);
  }
  }在eclipse编辑以上代码,在 frame.setTitle("testing"); 就出现了标题所示的提示,到底是什么意思呢?在frame定义处加个final就什么提示也没有,为什么呢?
是不是匿名类不能引用非final变量?

解决方案 »

  1.   

    JFrame frame=new JFrame(); 
    改成final JFrame frame=new JFrame(); 
      

  2.   

    晕 ...... 你问的为什么啊?我觉得应该是生命周期的问题! 如果你引用的外部变量不是一个final 的! 那么,可能在你的内部类运行期间 引用的外部变量 超出了生命周期之外(方法执行完了 ,可是内部类对象却还在引用该局部变量!)! 
      

  3.   


    package zhao;import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    public class FileChooseTest { 
    static JFrame frame = null;
      public static void main(String[] args){ 
       frame=new JFrame(); 
      final JTextField textfield=new JTextField(); 
      JButton button= new JButton("Choose File"); 
      button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
      frame.setTitle("testing"); 
      } 
      }); 
      frame.setLayout(new BorderLayout()); 
      frame.getContentPane().add(button,BorderLayout.NORTH); 
      frame.getContentPane().add(textfield,BorderLayout.SOUTH); 
      frame.addWindowListener(new WindowAdapter(){ 
      public void windowClosing (WindowEvent e){ 
      System.exit(0); 
      } 
      }); 
      frame.pack(); 
      frame.setVisible(true); 
      } 
      }
      

  4.   


    button.addActionListener(new ActionListener(){ //因为你在这个类ActionListener用到的frame是main方法里面的变量,
      public void actionPerformed(ActionEvent e){ 
      frame.setTitle("testing"); 
      } 
      });