首先程序如下:import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Exam5_8 extends Applet implements ItemListener
{
Choice cho;
TextField text;
public void init()
{
text=new TextField(10);
cho=new Choice();
cho.add("red");
cho.add("yellow");
cho.add("green");
cho.add("blue");
add(cho);
add(text);
cho.addItemListener(this);
}
public void itemStateChanged(ItemEvent e)
{
if(e.getItemSelectable()==cho)
String str=cho.getSelectedItem();
text.setText(str);
}
}
*这个程序在红色地方会报错:
Syntax error, insert ";" to complete Statement
Syntax error, insert "AssignmentOperator ArrayInitializer" to complete ArrayInitializerAssignement真是古怪的错误,然后只要把if下面的语句加上{},程序就能正常运行了,这是为什么啊
还有就是,如果去掉if语句,程序也能运行
在就是把String str定义在类的成员变量,而不定义在类方法里面,也可以运行,
太古怪了,实在搞不懂,望高手现身回答下,谢了!
import java.awt.*;
import java.awt.event.*;
public class Exam5_8 extends Applet implements ItemListener
{
Choice cho;
TextField text;
public void init()
{
text=new TextField(10);
cho=new Choice();
cho.add("red");
cho.add("yellow");
cho.add("green");
cho.add("blue");
add(cho);
add(text);
cho.addItemListener(this);
}
public void itemStateChanged(ItemEvent e)
{
if(e.getItemSelectable()==cho)
String str=cho.getSelectedItem();
text.setText(str);
}
}
*这个程序在红色地方会报错:
Syntax error, insert ";" to complete Statement
Syntax error, insert "AssignmentOperator ArrayInitializer" to complete ArrayInitializerAssignement真是古怪的错误,然后只要把if下面的语句加上{},程序就能正常运行了,这是为什么啊
还有就是,如果去掉if语句,程序也能运行
在就是把String str定义在类的成员变量,而不定义在类方法里面,也可以运行,
太古怪了,实在搞不懂,望高手现身回答下,谢了!
String str=cho.getSelectedItem();因为if后面没有花括号,所以只会执行一句,那么你的字符串变量str的作用域就只限于当前的这一条定义语句,定义好之后就没用了,就等着被垃圾收集器回收,编译器会认为这是一条没有意义的定义,就好像除数为0一样,一点意义都没有,所以编译器会报错。但是有了花括号之后就不同了,字符串变量str的作用域被扩大了,只要作用域没有结束,就可以对变量str进行任何操作,虽然你现在只有一条定义语句,但编译器会认为你可能以后会在后面添加对于str的处理。if(e.getItemSelectable()==cho)
{
String str=cho.getSelectedItem();
str=new String("...");
//可以对str进行任何操作
}
Syntax error, insert "AssignmentOperator Expression" to complete Assignment
恰恰是认为在单语句作用域情况下的语法错误 即加入了声明的赋值语句不完整
有这种判断暗示着编译器不允许此种情况出现。
另外我还想问个问题,我是刚学JAVA的,有些内容,怎么翻数都没有,所以只能到这来问了,希望你能在给我回答次
Java的事件类中几乎每个事件类都有返回触发事件源的方法,并且他们还都个公共的getsource()方法可以返回触发事件的事件源,他们之间有什么区别吗,都用getsource()来判断不就行了吗,为什么要那么多啊?好多书上都没给出解释,望高手解释下,谢谢了,另外Button里面的.getActioncommand()与.getLabel()方法什么区别啊,我试了下,觉得返回的都是Button上的字符啊?
这些问题困饶了我好半天了,真诚希望详细的解答,我会尽量给高分的.再次谢谢了!真心谢谢了,我会尽量加分的,谢谢了!
getActioncommand()方法返回的是字符串。该默认值为事件源所对应组件的标签。
getLabel()方法返回的也是字符串,返回的是组件的标签。getActioncommand()和getLabel()的区别:JButton jbutton_1=new JButton("jbutton");
JButton jbutton_2=new JButton("jbutton"); //两个按钮标签一样jbutton_1.setActionCommand("jbutton_1"); //设置按钮1的ActionCommand值为"jbutton_1"
jbutton_2.setActionCommand("jbutton_2"); //设置按钮2的ActionCommand值为"jbutton_2"System.out.println(jbutton_1.getLabel()); //输出:jbutton
System.out.println(jbutton_2.getLabel()); //输出:jbutton
System.out.println(jbutton_1.getActionCommand()); //输出:jbutton_1
System.out.println(jbutton_2.getActionCommand()); //输出:jbutton_2看到这里是不是有点明白了?当两个按钮的标签值一样时,使用getLabel()方法是不能区别事件源的,只有通过事先设置好的ActionCommand才能区别开来,如果懒得设置ActionCommand,就直接用getSource()方法来区别事件源。
public void itemStateChanged(ItemEvent e)
{
String str; //#1
if(e.getItemSelectable()==cho)
str=cho.getSelectedItem(); //#2
text.setText(str); //#3
}在#1行中,你声明了变量str,这里要注意,你只是声明,而没有定义,这时候str没有被初始化
在#2行中,你的确赋值了,但是如果if中的表示为false呢?#2行就不做了,这时候str仍然没有被初始化。
在#3行中,由于之前if语句没有做,导致str没有被初始化,这种情况下直接使用是编译器不允许的,所以会报错。简而言之,在使用一个引用前,必须确保任何一种情况下它都是被初始化过的,即必须创建一个对象让他用或者让他指向null。
作为一名初学者其实我最搞不清楚的是,既然用e.getsource()可以用在所有的事件类中(因为它们都继承了父类的)那么每个事件类自己的判别事件源的方法不就每什么必要了吗,全用e.getsource()多简洁方便啊!诸如什么e.getItemSelectable(),e.getItemSelectable().equals("")之类的,多麻烦啊!既然存在肯定有它的理由,望高手能给以详细解答了,另外谢谢所有回贴的人,向你们学习中
///////////////////////////////////////////////////////////////////////////////////////////////////
lz说的报错是这个吧The local variable str may not have been initialized局部变量可能未被初始化初始化一下就好了
String str="";
作为一名初学者其实我最搞不清楚的是,既然用e.getsource()可以用在所有的事件类中(因为它们都继承了父类的)那么每个事件类自己的判别事件源的方法不就每什么必要了吗,全用e.getsource()多简洁方便啊!诸如什么e.getItemSelectable(),e.getItemSelectable().equals("")之类的,多麻烦啊!既然存在肯定有它的理由,望高手能给以详细解答了,另外谢谢所有回贴的人,向你们学习中
它有它存在的意义 这个串就指定了与此事件相关联的命令名
与组件的名称含义是不同的 至于其如何被使用 则因人而异getSource和getItemSelectable诸如此类 getSource显然范围更宽泛
我想当一个组件有多个事件源的时候 要想确定具体的事件源getSource在这里就不适用了
比如一个item添加了itemSelect事件监听和鼠标覆盖监听 就必须得用具体的获取事件源方法
如getItemSelectable
合理的逻辑应该是:
if(e.getItemSelectable()==cho) {
String str=cho.getSelectedItem();
text.setText(str);
}
或者:
String str = "":
f(e.getItemSelectable()==cho)
str=cho.getSelectedItem();
text.setText(str);还有,局部变量是一定要显式初始化才能用的(哪怕初始化为null),只有成员变量才会自动初始化,这是基本常识。第二个问题,你的理解也不对。JAVA把label和command分开设置,这无可厚非呀,本来两者的执行的功能就不一样,label是负责界面显示的,command则是命令标识,两者没有理由一致,更不需要合二为一。同一个界面中,label相同的组件却有不同的行为,这种情况多的是!第三个问题,getSource()是Event类的,getItemSelectable()是ItemEvent类的,两者返回的是同一个东西,都是事件源对象。但是,getSource()返回的是一个Object,要使用getSource()返回的对象往往要向下转型;而getItemSelectable()则明确返回一个ItemSelectable,这样你就可以直接把它当作ItemSelectable来用,直接调用ItemSelectable接口中的方法而无需向下转型,这样更安全。总之,两者各有所用,不存在多余的情况。
楼主善于提出疑问这一点是很好的,但是在态度上,怀疑他人多于怀疑自己。
实际上,进步往往是从怀疑自己开始的。
JAVA是一门发展非常成熟的语言,是众多业界精英智慧的结晶,如果那么值得怀疑,它还能存在到今天么?
说的有点多了,不过我很同意楼上的见解,怀疑应该首先从自己开始,可能是我在表达方面显得过于强烈(没办法,这些问题苦恼我好半天了,显得急噪了些)才会让楼上兄弟对我产生了误解,这里再次对你表示感谢了,虽然对问题只是在表面上理解了,因为还是没涉及到具体的应用,,,不过我会继续努力的,再次谢谢了!
怀疑都是高手的作风,困惑都是初学者的作为。
public void itemStateChanged(ItemEvent e)
{
if(e.getItemSelectable()==cho)
{
String str=cho.getSelectedItem();
text.setText(str);
}
}
就可以了,因为if后面如果不加括号的话,就只能与下一行形成条件匹配,这样text.setText(str); 中的str就相当于没有定义了
public void init()
{JMenuBar myB=new JMenuBar();
setJMenuBar(myB);
JMenu m1=new JMenu("文件(E)");
m1.add(new JMenuItem("打开"));
JMenuItem m11=new JMenuItem("保存");
m1.add(m11);
m1.add("打印");
m1.addSeparator();
//JMenuItem exit=new JMenuItem("退出"); //exit.addActionListener(this);
m1.add(exit);
m1.addActionListener(this);
myB.add(m1);
JMenu m2=new JMenu("编辑(V)");
m2.add("复制");
JMenu m21=new JMenu("颜色");
m21.add("前景色");
m21.add("背景色");
m21.addActionListener(this);
m2.add(m21);
m2.addSeparator();
//JCheckboxMenuItem mycmi=new JCheckboxMenuItem("全选");
//mycmi.addItemListener(this);
//m2.add(mycmi);
m2.addActionListener(this);
myB.add(m2); JMenu m3=new JMenu("帮助(H)");
m3.add("关于");
m3.addActionListener(this);
myB.add(m3);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{if (e.getActionCommand()=="退出")
System.exit(0);
}
可是当我触发的时候却会报错!