黑马程序员技术交流社区
标题:
[已解决]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