import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Test7 extends JFrame {
JTextField tex;
Test7(){
tex = new JTextField(10);
JButton bt = new JButton("submit");
this.setLayout(new FlowLayout());
add(tex);
add(bt);
bt.addActionListener(new MyListener());
}

class MyListener implements ActionListener{ String s = tex.getText();  //为什么放在这里点击按钮不能得到s里面的内容  s的作用域不是这个类吗?
public void actionPerformed(ActionEvent arg0) {
//String s = tex.getText();  //放在这里点击按钮能得到s里面的内容 放在上面却不可以呢
JOptionPane.showMessageDialog(null,s);

}

}
public static void main(String args[]) {

new Test7().setVisible(true);
}
}

解决方案 »

  1.   

    这应该不是内部类的问题,是你实现ActionListener接口里actionPerformed的方法时,写在该方法里头的代码才会因为点击按钮而执行
      

  2.   

    楼主要搞明白一个问题 就是 当点击按钮触发事件并将这个事件发给了组件容器,
    组件容器的处理会通过调用actionPerformed方法,注意它只调用这个方法,不会初始化成员变量
    希望楼主明白
      

  3.   

    class MyListener implements ActionListener{        String s = tex.getText();  //这里会在对象被创建的时候调用,也就是bt.addActionListener(new MyListener());的时候调用,这时tex还是初始化状态,什么也没有
            public void actionPerformed(ActionEvent arg0) {
                //String s = tex.getText();  //这里是Action事件被触发的时候调用,即点击按钮的时候调用,这时tex可能有内容
                JOptionPane.showMessageDialog(null,s);
                
            }
            
        }
      

  4.   


    点击按钮就会调用 actionPerformed方法,不回执行actionPerformed方法外的语句