黑马程序员技术交流社区

标题: [已解决]GUI 问题 大家帮我看看这段代码 [打印本页]

作者: 黄克帅    时间: 2012-6-13 20:01
标题: [已解决]GUI 问题 大家帮我看看这段代码
本帖最后由 黄克帅 于 2012-6-14 10:46 编辑

有两个问题  1   有时候我运行的时候TextArea  不会显示出来  不知道是不是myeclipse的bug还是代码问题
2  为什么我的TextField  和TextArea   要设置成final  下面才能访问呢?
public class test {
        public static void main(String[] args) {

                Frame f = new Frame("窗体");
                f.setSize(600, 400);// 设置宽 高
                f.setLocation(400, 150);// 设置初始位置
                // f.setBounds() 设置 坐标 宽 高
                // 设置布局方式
                f.setLayout(new FlowLayout());
                f.setVisible(true);
               
                f.addWindowListener(new WindowAdapter() {
                          public void windowClosing(WindowEvent e) {
                                  System.exit(0);
                          }
                });

                // 创建单行文本框组件
                final TextField tf = new TextField(30);
                // 把文本框组件绑定到窗体
                f.add(tf);

                Button b2 = new Button("提交");
                f.add(b2);
                // 创建多行文本框
                final TextArea ta = new TextArea(10, 80);
                f.add(ta);

                b2.addActionListener(new ActionListener() {

                        public void actionPerformed(ActionEvent e) {
                                String text = tf.getText();
                                ta.append(text+"\r\n");
                                
                                tf.setText("");

                        }
                });

        }
}
作者: 江南    时间: 2012-6-13 20:26
本帖最后由 江南 于 2012-6-13 20:29 编辑

因为是匿名内部类    b2.addActionListener(new ActionListener() {}需加final才能访问
有时候我运行的时候TextArea没法显示那就 不是程序问题了!
作者: 李文富    时间: 2012-6-13 20:36

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MainClass {
    public static void main(String[] args) {

            Frame f = new Frame("窗体");
            f.setSize(600, 400);// 设置宽 高
            f.setLocation(400, 150);// 设置初始位置
            // f.setBounds() 设置 坐标 宽 高
            // 设置布局方式
            f.setLayout(new FlowLayout()); //我在运行时都可以显示到;可能和布局方式有关;
            f.setVisible(true);

            f.addWindowListener(new WindowAdapter() {
                      public void windowClosing(WindowEvent e) {
                              System.exit(0);
                      }
            });

            // 创建单行文本框组件
            final TextField tf = new TextField(30);//因为你要在内部类中用到tf.getText();所以要用final修饰;
            // 把文本框组件绑定到窗体
            f.add(tf);

            Button b2 = new Button("提交");
            f.add(b2);
            // 创建多行文本框
            final TextArea ta = new TextArea(10, 80);
            f.add(ta);

            b2.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                            String text = tf.getText();
                            ta.append(text+"\r\n");

                            tf.setText("");
                    }
            });

    }
}



作者: 王红霞    时间: 2012-6-13 21:36
new ActionListener()这个是匿名类,匿名类是内部类的一种.
b2.addActionListener(new ActionListener():传入一个ActionListner接口的实现类,但这个类没有名字(匿名类),这个类实现了ActionListner接口.
内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。

作者: 黄克帅    时间: 2012-6-14 00:29
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final
作者: 杨雪    时间: 2012-6-14 08:28
黄克帅 发表于 2012-6-14 00:29
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final ...

因为编译程序实现上的困难

内部类对象的生命周期会超过局部变量的生命期。局部变量是当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束后,退栈,这些局部变量全部死亡,但是,内部类对象生命周期与其他类一样,匿名内部类是内部类的一种,当创建对象后,只有当没有其他人再饮用它时,他才能死亡。
所以,完全可能一个方法已经调用结束(局部变量已经死亡),但是该局部类的对象还活着,就是说:局部变量的生命周期要至少等于或者大于内部类对象的生命周期。
因此,局部内部类的对象可以访问被定义为final的局部变量。懂没?
作者: 史卜坤    时间: 2012-6-14 09:21
黄克帅 发表于 2012-6-14 00:29
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final ...

是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2