一个奇怪的监听器的例子,谁有兴趣看看啊!
我以前以为监听器就是时刻监听,一旦监听对象发生变化,立刻执行相应代码
可这个例子中,监听器确实是对TextArea内的值变化监听并执行了代码,但好像不是立即,我在代码中的一切变更它都不会显现出来,这个很不好啊,谁跟我说说这是为什么啊?看源码我是看不懂的呀!
----------------解决方案--------------------------------------------------------
是你自己理解错了吧,监听执行过程正常,一旦事件条件变更,代码就会被执行。
----------------解决方案--------------------------------------------------------
回复 2楼 ren829
可是我上面的例子,明显说明是在我这块代码结束之后监听才起作用的,上面的只是一个小例子,我主要是在一个大一些的程序中遇到了这个问题,我在对TextArea改动后又把改动状态改回为未修改,但直到我修改完后,对TextArea的监听才运行,它会立刻把我的未修改状态再改回到已修改,让我实在是没有办法,只能说明它肯定不是一遇到条件变动代码就执行的 ----------------解决方案--------------------------------------------------------
是在没理解你的意思,你代码里改什么了?无非是内容改变的时候,i重新赋值为1,然后打印出来,
----------------解决方案--------------------------------------------------------
程序代码:
import java.awt.*;
import java.awt.event.*;
public class text1 implements TextListener {
int i=0;
Frame frame=null;
TextArea textArea=null;
public static void main(String[] args) {
new text1();
}
public text1() {
text();
System.out.println("程序执行完后 i="+i);
}
private void text() {
frame=new Frame("test");
textArea=new TextArea("");
textArea.addTextListener(this);
frame.add(textArea);
frame.setBounds(300,300,300,300);
frame.setVisible(true);
textArea.setText("fffffffff");
System.out.println("文本变化后1 i="+i);
}
public void textValueChanged(TextEvent e) {
i=1;
System.out.println("监听器生效 i="+i);
}
}
按我理解,textArea.setText("fffffffff")后说明文本发生了变化,那么监听器会被触动,“文本变化后i”不就应该输出为1了吗?但不是这样的,它还是零;那么咱再等等,等到程序执行完成后,"程序执行完后 i="是不是就应该是1了,可是还不是;一直到全部执行完了,监听器才被触发,执行结果如下图:import java.awt.event.*;
public class text1 implements TextListener {
int i=0;
Frame frame=null;
TextArea textArea=null;
public static void main(String[] args) {
new text1();
}
public text1() {
text();
System.out.println("程序执行完后 i="+i);
}
private void text() {
frame=new Frame("test");
textArea=new TextArea("");
textArea.addTextListener(this);
frame.add(textArea);
frame.setBounds(300,300,300,300);
frame.setVisible(true);
textArea.setText("fffffffff");
System.out.println("文本变化后1 i="+i);
}
public void textValueChanged(TextEvent e) {
i=1;
System.out.println("监听器生效 i="+i);
}
}
这是不是说监听器并不是实时执行的??!
----------------解决方案--------------------------------------------------------
一些问题
本人是新手,谁能给我推荐一个新手适合的java教程,还有做编程的人员需要考什么证书? ----------------解决方案--------------------------------------------------------
以下是引用h781458175在2013-5-15 21:30:39的发言:
import java.awt.*;
import java.awt.event.*;
public class text1 implements TextListener {
int i=0;
Frame frame=null;
TextArea textArea=null;
public static void main(String[] args) {
new text1();
}
public text1() {
text();
System.out.println("程序执行完后 i="+i);
}
private void text() {
frame=new Frame("test");
textArea=new TextArea("");
textArea.addTextListener(this);
frame.add(textArea);
frame.setBounds(300,300,300,300);
frame.setVisible(true);
textArea.setText("fffffffff");
System.out.println("文本变化后1 i="+i);
}
public void textValueChanged(TextEvent e) {
i=1;
System.out.println("监听器生效 i="+i);
}
}按我理解,textArea.setText("fffffffff")后说明文本发生了变化,那么监听器会被触动,“文本变化后i”不就应该输出为1了吗?但不是这样的,它还是零;那么咱再等等,等到程序执行完成后,"程序执行完后 i="是不是就应该是1了,可是还不是;一直到全部执行完了,监听器才被触发,执行结果如下图:
这是不是说监听器并不是实时执行的??!
import java.awt.*;
import java.awt.event.*;
public class text1 implements TextListener {
int i=0;
Frame frame=null;
TextArea textArea=null;
public static void main(String[] args) {
new text1();
}
public text1() {
text();
System.out.println("程序执行完后 i="+i);
}
private void text() {
frame=new Frame("test");
textArea=new TextArea("");
textArea.addTextListener(this);
frame.add(textArea);
frame.setBounds(300,300,300,300);
frame.setVisible(true);
textArea.setText("fffffffff");
System.out.println("文本变化后1 i="+i);
}
public void textValueChanged(TextEvent e) {
i=1;
System.out.println("监听器生效 i="+i);
}
}按我理解,textArea.setText("fffffffff")后说明文本发生了变化,那么监听器会被触动,“文本变化后i”不就应该输出为1了吗?但不是这样的,它还是零;那么咱再等等,等到程序执行完成后,"程序执行完后 i="是不是就应该是1了,可是还不是;一直到全部执行完了,监听器才被触发,执行结果如下图:
这是不是说监听器并不是实时执行的??!
晕了,你些的这些,文本变化后,程序执行后,那是你认为的执行顺序,可不是程序真正的执行顺序, 首先被执行的是构造器,所以你构造器里的text()里的打印语句被执行,然后是构造器的打印语句,然后才是监听变化的打印语句,别被自己给误导了。
----------------解决方案--------------------------------------------------------
回复 7楼 ren829
那我就描述一下我遇到的问题:我在作一个java记事本,其中有一个变量(String型),它用来标记文本是否被改变(这样我在关闭、新建、打开时就可以用它来判定要不要弹出保存询问框);
举其中一个为例子,比如“新建”:
当新建时我是这样处理的:先把前一个文本清空,将标题换成“无标题-记事本”,然后再将标记修改与否的变量标记为“未修改”,因为刚新建的文本肯定是未修改的嘛!但此时问题就来了,因为我自以为的那个问题,即监听器不是实时触发的,在我这些动作完成后,它才去检测文本是否被修改,这时它认为我的文本从有内容状态变为空状态是发生了变化,所以这时它就又把我标记修改与否的变量改为了“已修改”(这是我textListener里的动作);相当于我的这个标记变量经历了一个这样的过程:已修改--未修改----已修改;这样我一个刚刚新建的文本就是一个已修改的文档,让我很不舒服,这不合乎常理啊,再有打开一个文档也有这种情况,一个刚刚打开的文档已是“已修改”;这是不是说明监听器不是实时触发的呀,或者有什么办法能解决我的这个问题呢?
也可能我的用词不是很准,但这确实是一个问题!
----------------解决方案--------------------------------------------------------