import java.applet.*; import java.awt.*; import java.awt.event.*;
class MyButton extends Button implements TextListener,ActionListener { TextArea text1,text2; MyButton(String s) { super(s); text1=new TextArea(10,10); text2=new TextArea(20,20); text1.addTextListener(this); this.addActionListener(this); } public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); } public void actionPerformed(ActionEvent e) { text1.setText(null); } }
public class Test4 extends Applet implements ActionListener { MyButton button; public void init() { button=new MyButton("点击看我能发生什么?"); button.addActionListener(this); add(button.text1);add(button.text2);add(button); } public void actionPerformed(ActionEvent e) { button.text1.setText(button.getLabel()); button.text2.setText("ok!"); }
}
大家说下结果是什么?
能告诉我为什么 button.text2.setText("ok!"); 没执行呢?
----------------解决方案--------------------------------------------------------
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
原因在于这里,当发生按钮点击事件后会先执行按钮的事件监听器也就是: public void actionPerformed(ActionEvent e) { button.text1.setText(button.getLabel());
button.text2.setText("ok!"); }
上面这段代码会先被执行,这时text2的文本是"ok!"然后这段代码结束,但是
public void textValueChanged(TextEvent e)
这里有一个text1的事件该事件是在text1文本被改变时触发。
text2.setText(text1.getText()); 执行了这句话后text2的文本与text1的一样。
楼主的例子说明事件发生后程序会顺序的先执行完本身监听器的代码,再去执行其他代码。
public void actionPerformed(ActionEvent e) { button.text1.setText(button.getLabel());
button.text2.setText("ok!"); }
也就是说这个程序楼主想象的是button.text1.setText(button.getLabel());执行完这句会触发 public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
这个事件,但事实是
public void actionPerformed(ActionEvent e) { button.text1.setText(button.getLabel());
button.text2.setText("ok!"); }
真正的运行过程是直到这个事件结束也就是button.text2.setText("ok!");
这段代码结束并且从“}“的作用域退出后才会执行 public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
这段代码,所以会出现button.text2.setText("ok!"); 这句好像没有执行的假象一样。楼主如果把TextListener的事件代码注掉或删除掉,就会出现楼主希望看到的结果。
----------------解决方案--------------------------------------------------------
意思我明白了
但是你这样说的话,那
public void actionPerformed(ActionEvent e) { text1.setText(null); }
不就不执行了?
----------------解决方案--------------------------------------------------------
把程序
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); button.text1.setText(button.getLabel()); } 变成
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); // button.text1.setText(button.getLabel()); } 后
在text1中输入文本字,text2就会出现一样的字;
就执行:
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
但是我点击按钮"电击看我能发生什么?"时:
第一次点击:两个文本都为空;
第二次点击:text1为空,text2为"ok!"
这个过程又怎么解释?
当然,从text1空文本点击"电击看我能发生什么?"时执行:
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); }
结果都一样:
text1为空, text2为"ok!".
----------------解决方案--------------------------------------------------------
把程序
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); button.text1.setText(button.getLabel()); } 变成
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); // button.text1.setText(button.getLabel()); } 后
在text1中输入文本字,text2就会出现一样的字;
就执行:
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
但是我点击按钮"电击看我能发生什么?"时:
第一次点击:两个文本都为空;
第二次点击:text1为空,text2为"ok!"
这个过程又怎么解释?
当然,从text1空文本点击"电击看我能发生什么?"时执行:
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); }
结果都一样:
text1为空, text2为"ok!".
这是因为你设的
public void actionPerformed(ActionEvent e) { text1.setText(null); }
null的缘故,但是这个程序蹊跷之处就在于此,当第一次点击按钮时,执行了
public void actionPerformed(ActionEvent e) { button.text2.setText("ok!"); }
这个部分设置为ok!,而后Button执行了自己类的事件代码, public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); } public void actionPerformed(ActionEvent e) { text1.setText(null); }
把text1设置为空,而这时text1.addTextListener(this); 因为这句话
使得text2也变为空,这时触发了textValueChanged事件。
第2次点击时
public void actionPerformed(ActionEvent e) { button.text1.setText(button.getLabel()); button.text2.setText("ok!"); }
同样先执行这段代码把text2变成"ok!",然后Button还继续执行自己的事件代码。
蹊跷之处就在这时, public void actionPerformed(ActionEvent e) { text1.setText(null); }
button本身的这个事件被触发设置为空,但是前一次的结果也是空。
而出现了
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
这个事件没有被执行的现象,因为这时并没有触发text1的textValueChanged事件。
这个肯定与null有关,因为如果不是text1.setText(null);如果换成text1.setText(“123“);的情况无论如何都会触发
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
这个事件,也就会出现两个文本框都一样文字的情况。也就是关键在于text1.setText(null);两次按钮单击都会变为空,而正是因为空值所以
public void textValueChanged(TextEvent e) { text2.setText(text1.getText()); }
这个事件没有被触发。
----------------解决方案--------------------------------------------------------
主类中的:button.text2.setText("ok!");----------1
button本身类的事件:
text2.setText(null);-----------------------------------2
text1.setText(text1.getText());-----------------------------------3
text1不为空时执行顺序:1->2->3->TextListener->2:j结果text1和text2都为空。
text1为空时执行顺序:1->2->3:结果text1为空 text2为"ok".
理解是理解了。
但是当注释// button.text1.setText(button.getLabel())取消后变成:
主类中的:button.text2.setText("ok!");----------1
button.text1.setText(button.getLabel());-------2
button本身类的事件:
text2.setText(null);-----------------------------------3
text1.setText(text1.getText());-----------------------4
不管text1空不空执行结果都是:text1和text2的类容一样为:“点击看我能发生什么?”
我搞不懂执行顺序,怎么总觉得button本身类的3:text1.setText(null);没有被执行。
按照:先主类的事件,后button本身类的事件的顺序原则。3应该是被执行才对啊。
如果3被执行的话,那么4也会被激发,结果也应该text1,text2都会为空啊。
但是结果是:text1和text2的类容一样为:“点击看我能发生什么?”
您能告诉我这些事件的执行顺序吗
----------------解决方案--------------------------------------------------------
其实最简单的方法可以搞清顺迅把每个事件代码内加入System.out.println(“事件1“)的这种方法,当点击时就会在DOS窗口出现文字。
----------------解决方案--------------------------------------------------------
谢谢yms123
这种方法果然见效,马上明白。
----------------解决方案--------------------------------------------------------